DOM与SAX
1.DOM和SAX
解析xml文件有两种方式dom和sax方式.
DOM和SAX都只是接口,是解析xml的两种标准.
(1)使用DOM要求解析器把整个XML文档装载到一个Document对象中。Document对象包含文档元素,即根元素,根元素包含N多个子元素…
一个XML文档解析后对应一个Document对象,这说明使用DOM解析XML文档方便使用,因为元素与元素之间还保存着结构关系。
优点:使用DOM,XML文档的结构在内存中依然清晰。元素与元素之间的关系保留了下来!
缺点:如果XML文档过大,那么把整个XML文档装载进内存,可能会出现内存溢出的现象
(2) DOM会一行一行的读取XML文档,最终会把XML文档所有数据存放到Document对象中。SAX也是一行一行的读取XML文档,但是当XML文档读取结束后,SAX不会保存任何数据,同时整个解析XML文档的工作也就结束了。
但是,SAX在读取一行XML文档数据后,就会给感兴趣的用户一个通知!例如当SAX读取到一个元素的开始时,会通知用户当前解析到一个元素的开始标签。而用户可以在整个解析的过程中完成自己的业务逻辑,当SAX解析结束,不会保存任何XML文档的数据。
优点:使用SAX,不会占用大量内存来保存XML文档数据,效率也高。
缺点:当解析到一个元素时,上一个元素的信息已经丢弃,也就是说没有保存元素与元素之间的结构关系,这也大大限制了SAX的使用范围。如果只是想查询XML文档中的数据,那么使用SAX是最佳选择!
-------------
DOM4J和JDOM
它们两个也是接口,也是解析xml的标准,只不过它们都支持以DOM和SAX两种试解析xml文件.
dom4j本身是一个规范,使用它来解析xml也需要底层的解析器支持,
DOM和SAX是解析xml的两种方式,它们只是接口.而JDOM和DOM4J是真正的解析器,是实现类,一个解析器应该提供了两种解析xml文件的方式,也就是说JDOM和DOM4J都实现了DOM和SAX接口.使用JDOM和DOM4J都可以以DOM或SAX的方式来解析xml文档.
这里需要注意的是DOM4J本身也是接口,它是一组规范然而: 对于DOM而言,DOM本身没有提供已经实现的解析器, 而对于DOM4J而言,DOM4J自己提供了一个解析器,如果DOM4J没有找到其他的解析器,那么它将使用自己的解析器.使用者需要注意,DOM4J解析的结果是org.dom4j.Document,而不是org.w3c.Document。DOM4J与DOM一样,只是一组规范(接口与抽象类组成),底层必须要有DOM4J解析器的实现来支持。
--------------
JAXP
JAXP与解析器的关系就是像JAP与hibernat,toplink的关系
所以一个xml解析器不仅仅要实现DOM和SAX接口还需要实现JAXP接口.
1. 当一个解析器实现了DOM和SAX接口那么我们就可以使用这个解析器通过两种方式dom和sax方式来解析xml文档.
2. 当多个xml解析器都实现了JAXP接口那我们就可以直接实现JAXP接口中定义的方法来解析xml而不需要关心特定解析器提供的方法,而事实上各个xml解析器提供的解析类和解析方法是不同的:例如DOM4J和JDOM提供的类和方法一定是不同的,并且使用方式也不相同, 我们使用JAXP的好处就是不需要知道解析器的底层实现.就像我们使用JAP就可以任意切换底层的ORM框架的实现产品.