JAVA中xml的DOM和SAX解析

来源:互联网 发布:编程求1—100质数 编辑:程序博客网 时间:2024/06/07 22:35
注:这个例子来自imooc。
***********************************DOM解析*****************************************************

import java.io.IOException;import javax.lang.model.util.AbstractTypeVisitor6;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class DomRead {public static void main(String[] args) {// 创建DoucumentBuilderFactory的对象。DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try {// 创建一个DocumentBuilder的对象。DocumentBuilder db = dbf.newDocumentBuilder();// 相对路径;//通过documentBulider对象的parse方法加载xml文件。Document document = db.parse("books.xml");//获取所有book节点的集合NodeList bookList = document.getElementsByTagName("book");//遍历每一个book节点.for( int i=0;i<bookList.getLength();i++ ){//*****************不知道属性名*********************//使用item方法获取每一个book节点。Node book = bookList.item(i);//获取book节点的所有属性NamedNodeMap nnm = book.getAttributes();//遍历book的属性for( int j=0;j<nnm.getLength();j++ ){Node attr = nnm.item(j);System.out.println("属性:"+attr.getNodeName()+" 值:"+attr.getNodeValue());} //******************知道属性的名称。********************//Element book = (Element)bookList.item(i);//String attr = book.getAttribute("id");//System.out.println("属性:id"+"值: "+attr);//获取book的子节点。NodeList childNodes = book.getChildNodes();for( int j=0;j<childNodes.getLength();j++ ){Node child = childNodes.item(j);//区分出text类型的node以及element类型的nodeif( child.getNodeType()==Node.TEXT_NODE )continue;//获取node节点的值。System.out.println(child.getNodeName()+" : "+child.getTextContent());}}} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ParserConfigurationException e) {e.printStackTrace();}}}
*********************************************SAX解析*****************************************************

SAX相对DOM而言具有占用内存小的优势。并且SAX可以在不清楚XML结构的时候对XML进行遍历。
SAX共分为5个阶段,对应了5个方法:startDocument,endDocument,startElement,endElement,characters,分别为开始遍历文件,结束遍历文件,开始遍历标签,结束遍历标签以及遍历标签内容。
实现时需要继承Handler类并重写上面5个方法。
Main方法代码

import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;public class SaxRead {public static int cnt = 1;public static void main(String[] args) {//获取SAXParserFactory实例。SAXParserFactory spf = SAXParserFactory.newInstance();try {//通过factory获取SaxParser实例。SAXParser parser = spf.newSAXParser();//需要一个handler对象。SaxParserHandler handler = new SaxParserHandler();parser.parse("books.xml", handler);   }catch (IOException e) {e.printStackTrace();}  catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}}}
SaxParserHandler类的代码:
import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SaxParserHandler extends DefaultHandler {//遍历开始标签。@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);//qname为标签名称。if( qName.equals("book") ){System.out.println("This is " +(SaxRead.cnt)+ " book!");//知道属性名称。//System.out.println("book的属性为: "+attributes.getValue("id"));//不知道属性名称和个数。for( int i=0;i<attributes.getLength();i++ ){System.out.println("属性名:"+attributes.getQName(i)+" 属性值:"+attributes.getValue(i));}}else if( !qName.equals("bookstore") ){System.out.print("节点名是:"+qName);}}//遍历标签中的text内容。@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);String text = new String(ch,start,length);//trim为去掉字符串中的空格。if( !text.trim().equals("") ){System.out.println(" 节点值是: "+text);}}//遍历结束标签。@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);if( qName.equals("book") ){System.out.println("**********The " +(SaxRead.cnt++)+ " book is over!*************");}}//用来标志解析开始。@Overridepublic void startDocument() throws SAXException {super.startDocument();System.out.println("SAX解析开始");}//用来标志解析结束。@Overridepublic void endDocument() throws SAXException {super.endDocument();System.out.println("SAX解析结束");}}


                                             
0 0
原创粉丝点击