DOM,即Document Object Model,中文叫文档对象模型。DOM是W3C定义的标准文档对象模型,是一个与操做系统和编程语言无关的、用于内存存储和操做层次化文档的模型。当按 照DOM模型解析XML文档时,就会在内存中构造一个对应的DOM树,它能够用于不一样节点之间的遍历。然而,在遍历以前必须先完成DOM树的构造。所以, 在处理规模较大的XML文档时就很耗内存,占用资源较多。尤为是只须要操做文档中一小部分时效率很低。java
SAX,即Simple API for XML的简称,中文叫XML简单应用程序接口。它是一个事实上的标准。与DOM不一样的是,它是用事件驱动模型。解析XMl文档时每遇到一个开始或者结束标 签、或者属性、或者一条指令时,程序就产生一个事件来进行相应的处理。因此在操做文档以前不须要对整个文档进行解析。实际上,文档的各个部分能够在进行解 析的同时进行操做。所以,SAX相对于DOM来讲更适合操做大文档。编程
下面介绍一下SAX解析XML文档的方法:编程语言
1.经过SAXParserFactory的静态newInstance()方法获取SAXParserFactory实例ide
SAXParserFactory factory = SAXParserFactory.newInstance();
2.经过SAXPareserFactory实例的newSAXParser()方法返回SAXParser实例操作系统
SAXParser parser = factory.newSAXParser();
3.建立一个类继承DefaultHandler,重写其中的一些方法来处理业务,并建立这个类的实例code
4.调用parse()方法进行解析xml
File f = new File("book.xml"); parser.parse(f, sdh);
下面仍是直接上例子吧。对象
xml文件继承
<?xml version="1.0" encoding="UTF-8" ?> <bookstore> <book id="1"> <name>111</name> <author>222</author> </book> <book id="2"> <name>333</name> <author>444</author> </book> </bookstore>
具体实现接口
SAXxml.java
package com.lpp.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.lpp.handler.SAXHeadler; public class SAXxml { public static void main(String[] args) { // TODO Auto-generated method stub SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parser = factory.newSAXParser(); SAXHeadler sdh=new SAXHeadler(); File f = new File("book.xml"); parser.parse(f, sdh); } catch (ParserConfigurationException | SAXException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
SAXHandler.java
package com.lpp.handler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXHeadler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); System.out.println("开始解析"+qName); if(qName.equals("book")) { String value = attributes.getValue("id"); System.out.println("id:"+value); System.out.println(); } else if(qName.equals("bookstore")) { System.out.println(); } else if(!qName.equals("book")&&!qName.equals("bookstore")) { System.out.println("节点名:"+qName); } // System.out.println(); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); System.out.println("结束解析"+qName); System.out.println(); } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("开始解析xml文档"); System.out.println(); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("结束解析xml文档"); System.out.println(); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); String chs=new String(ch, start, length); if(!chs.trim().equals("")) { System.out.println("节点值:"+chs); } } }
注意 xml文档中会有空白的节点值,因此在重写characters()方法时,加上了判断条件。String chs=new String(ch, start, length); if(!chs.trim().equals("")), 判断节点值不为空时才进行输出操做。