XML解析--DOM方式和SAX方式的对比
在上一节我们已经介绍了XML的相关基本的知识,对XML的结构模型也有了相对的了解。对于XML的解析思想主要有两种方式:DOM方式解析和SAX解析方式。下面我们就对这两种方式进行对比学习。 一、DOM解析方式思想 1.DOM解析是构建整个文档驻留内存的树模型。 看到上面的DOM解析XML的思想,也许觉得很抽象。下面我们就通过一个XML文档来介绍DOM解析XML的思想: eg: XML文档:domParse.xml <?xml version="1.0" encoding="UTF-8"?> <computer> <price>5000</price> <hardware> <screen>samsung</screen> <keyboard>luoji</keyboard> <mouse>ausa</mouse> </hardware> <software> <JAVAIDE>Eclipse</JAVAIDE> <JAVAIDE>MyEclipse</JAVAIDE> </software> </computer>
从上面的DOM树,我们应该很清楚Dom的解析思想了:其实就是在我们的程序对xml进行操作之前,DOM解析器就把整个文档读取到内存中去了。 知道了Dom解析的思想后,我们对其方式进行的利弊进行一下分析: (1)、优点: a.能够从整体上去把我文档结构,十分方便对xml文档的节点进行crdu操作; b.只需要解析一次拿到dom对象之后就可以重复使用该对象进行操作,可以减少解析的次数 (2)、缺点: a.解析过程比较慢,需要将整个文档都解析完成后才能进行操作; b.需要将整个文档的内容都加载到内存中,比较消耗内存,当文档过大时,这种方式对内存的要求是很大的; c.如果只关注文档的一小部分,会造成资源的极大浪费; d.解析的时候,会有延迟,因为每次都是从头开始遍历。 二、SAX解析方式思想 SAX解析方式是基于事件驱动的方式来解析的。当解析器发现元素开始、元素结束、文本、文档的开始或结束时,会触发相应的方法去处理。 同样的,我们对上面的XML文档也通过画图的方式来说明SAX的解析思想: 同样,我们对SAX的解析方式思想通过上面的图的形式,可以清楚的描述其实现解析的思想。 下面,谈谈SAX解析方式的优点和缺点: (1)优点 a.不需要等待整个xml文档全部加载到内存中,当解析到某一部分的时候自动触发到对应的方法去做处理,处理的效率比较高; b.不需要将整个文档加载到内存中去,对内存的要求比较低,无论多大的xml理论上都可以解析,而且没有延迟。 (2)缺点 a.每次解析都只能处理一次,下次要再次处理还要重复的执行解析操作; b.只能进行查询,不能进行增删改的操作。 对于SAX的解析方式,简单的附上一个Demo,只需要了解即可: xml文件: <?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>Java就业培训教程</书名> <pre class="java" name="code"> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架>
package com.jjyy.xml.sax; 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; /** * Sax方式解析XML * @author JiangYu * */ public class XmlSaxParse { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(new MyConentHandler()); xmlReader.parse("book.xml"); } } class MyConentHandler extends DefaultHandler{ private String eleName; private int count = 0; public void startElement(String uri,String localName,String name,Attributes atts) throws SAXException { this.eleName = name; } public void characters(char[] ch,int start,int length) throws SAXException { if("书名".equals(this.eleName)&& ++count==2){ System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri,String name) throws SAXException { this.eleName=null; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |