JAVA中xml的DOM和SAX解析

xiaoxiao2021-02-28  95

注:这个例子来自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类型的node if( 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 { //遍历开始标签。 @Override public 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内容。 @Override public 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); } } //遍历结束标签。 @Override public 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!*************"); } } //用来标志解析开始。 @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("SAX解析开始"); } //用来标志解析结束。 @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("SAX解析结束"); } }

转载请注明原文地址: https://www.6miu.com/read-54881.html

最新回复(0)