具体解释XML解析(⼀)—解析接⼝浅析
在DRP项⽬中接触到了⼀个XML解析⼯具DOM4J,它作为解析⼯具的据说性能很优秀。可是刚刚接触解析⼯具不久,⽽且也没有使⽤过其它的解析⼯具。因此对于DOM4J的性能没有直接的感受(没有參照物)。只是,本篇博客先临时不直接讲DOM4J。
之前说过,对于⼯具特别是优秀的⼯具,我们要学习的不仅仅是使⽤⽽已,⽽须要更深层次的学习。好了,開始吧,⾸先我们要先了解⼀下解析器。
解析器
使用dom4j解析xml文件解析器的作⽤就是将XML⽂档转换为应⽤程序可操作的对象。即读⼊⼀个XML⽂档并分析其结构。然后,应⽤程序通过解析接⼝訪问或者操作XML⽂档。
以下以DOM为例,了解⼀下解析器和解析接⼝在应⽤中的位置。
基于DOM(Document Object  Model)
DOM之前的博客有过介绍了,即⽂档对象模型。
XML转换是通过解析器完毕的,之后我们才⼲对XML⽂档进⾏读取操作。使⽤DOM操作XML⽂档主要须要通过下⾯⼏种操作:载⼊XML⽂档→遍历XML⽂档→操作控制XML⽂档节点(增、删、改)。
DOM基本接⼝:
Document:是对⽂档进⾏操作的接⼝,同⼀时候该节点是DOM对象树的根节点。提供了对⽂档中的数据进⾏訪问和操作的⼊⼝。另外。元素、节点、凝视、处理指令都⽆法脱离⽂档的上下⽂关系⽽独⽴存在。
所以在Document接⼝还提供了创建其它节点对象的⽅法。
Node:代表DOM树中的⼀个节点。Node 接⼝在整个DOM树中具有举⾜轻重的地位,DOM接⼝中有⾮常⼤⼀部分接⼝是从Node接⼝继承过来的,⽐如,Element、Attr、 CDATASection等接⼝,都是从Node继承过来的。
NodeList:提供了对节点集合的抽象定义。它并不包括怎样实现这个节点集的定义。
NodeList⽤于表⽰有顺序关系的⼀组节点,⽐⽅某个节点的⼦节点序列。在 DOM中。NodeList的对象是"live"的,换句话说,对⽂档的改变,会直接反映到相关的NodeList对象中。⽐如,假设通过DOM获得⼀个 NodeList对象,该对象中包括了某个Element节点的全部⼦节点的集合,那么,当再通过DOM
对Element节点进⾏操作(加⼊、删除、修改节点中的⼦节点)时,这些改变将会⾃⼰主动地反映到NodeList对象中,⽽不需DOM应⽤程序再做其它额外的操作。
NamedNodeMap:表⽰能够通过名字来訪问的⼀组节点集合。
DOM接⼝优缺点分析
⾸先我们要了解DOM是要在内存中建⽴⽂档树。这是它的特点的决定性因素。
由于。树在内存中的存在是持久的。所以。这就保证了DOM接⼝随机訪问的特点。同⼀时候,也是由于树在内存中的存在。因此对于⼤型的XML⽂档的解析会耗费内存。⽽接下来介绍的SAX接⼝则与DOM接⼝全然相反。
基于SAX(Simple API for XML)
相对与SAX是⼀种轻量型的⽅法。它针对的就是DOM接⼝处理⼤⽂档时⽐較费时、费⼒、⾮资源的问题。
它是⼀种替代。
SAX接⼝依序读⼊⽂件并产⽣对应的事件。
  主要接⼝:
SAXParserFactory:⽤来依照系统属性中定义的创建⼀个分析器实例。
Parser:定义了类似setDocumentHandler的⽅法来创建事件处理函数。
  DocumentHandler :当分析器遇到XML⽂档中的标记时激活该接⼝中的startDocument,endDocument。startElement,endElement等⽅法。
ErrorHandler:当分析器遇到不⽤的错误时。就会激活error、fatalError等⽅法。
DTDHandler:处理DTD中定义时,调⽤该接⼝中的⽅法。
优缺点分析
这样的处理的长处很类似于流媒体的长处。分析可以马上開始,⽽不是等待全部的数据被处理。
并且,因为应⽤程序仅仅是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于⼤型⽂档来说是个巨⼤的长处。其实。应⽤程序甚⾄不必解析整个⽂档;它可以在某个条件得到满⾜时停⽌解析。⼀般来说,SAX ⽐ DOM 快很多。还有⼀⽅⾯,因为应⽤程序没有以不论什么⽅式存储数据,使⽤ SAX 来更改数据或在数据流中往后移是不可能的。
基于JDOM(Java Document Object Model)
这样的接⼝类似于DOM接⼝因此不再复述。
总的来说,对于XML的訪问和操作要通过接⼝来实现,⽽解析器则实现接⼝。这也就是上⾯图所表达的意思。另外关于选择使⽤哪个接⼝来訪问XML数据,这还是依据各个接⼝的特点⾃⼰选择。⽽且,博客⾥介绍的两种接⼝特点还是⽐較鲜明的,因此适⽤的环境应该也⽐較清晰。对解析接⼝应该有所了解了。下篇介绍DOM4J。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。