DOM解析与SAX解析之间的对比
- 在使用dom解析xml文档时,需要读取整个xml文档,在内存中架构出代表整个xml文档的document对象,然后再对xml文档进行操作,此种情况下,如果xml文档特别大,就会大量消耗计算机的内存,并且容易导致内存溢出。而SAX解析则允许在读取文档时,立即对文档进行处理,不必等到整个文档都加载完才开始处理。
SAX解析方式的原理和步骤
- SAX采用事件处理的方式解析XML文档,利用SAX解析xml文档涉及到两个部分,解析器和事件处理器。
- 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
- 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的XML文件内容作为方法的参数传递给事件处理器。
- 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松的得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
- 下面这张图很好的说明了SAX解析方式的工作流程
package com.qztc.sax; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class Demo3 { public static void main(String[] args) throws Exception, Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser sp = factory.newSAXParser(); XMLReader reader = sp.getXMLReader(); BeanListHandler handler = new BeanListHandler(); reader.setContentHandler(handler); reader.parse("src/book.xml"); List<Book> list = handler.getList(); System.out.println((list.get(1)).getName()); System.out.println((list.get(1)).getAuthor()); System.out.println((list.get(1)).getPrice()); } } class BeanListHandler extends DefaultHandler{ private List<Book> list = new ArrayList<Book>(); private String currentTag; private Book book; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { currentTag = qName; if ("书".equals(qName)) { book = new Book(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if("书名".equals(currentTag)){ String name = new String(ch,start,length); book.setName(name); } if("作者".equals(currentTag)){ String author = new String(ch,start,length); book.setAuthor(author); } if("售价".equals(currentTag)){ String price = new String(ch,start,length); book.setPrice(price); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("书名".equals(qName)){ list.add(book); book = null; } currentTag = null; } public List getList() { return list; } }
- 我们最常使用的事件处理器是ContentHandler,经过阅读API文档,常用的方法有:startElement(),endElement(),character(),三个方法。