具体解释XML解析(一)—解析接口浅析
在DRP项目中接触到了一个XML解析工具DOM4J,它作为解析工具的据说性能很优秀。可是刚刚接触解析工具不久,而且也没有使用过其它的解析工具。因此对于DOM4J的性能没有直接的感受(没有參照物)。只是,本篇博客先临时不直接讲DOM4J。
之前说过,对于工具特别是优秀的工具,我们要学习的不仅仅是使用而已,而须要更深层次的学习。好了,開始吧,首先我们要先了解一下解析器。
解析器
解析器的作用就是将XML文档转换为应用程序可操作的对象。即读入一个XML文档并分析其结构。然后,应用程序通过解析接口訪问或者操作XML文档。
以下以DOM为例,了解一下解析器和解析接口在应用中的位置。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b2ppYWppbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
基于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。
具体解释XML解析(一)—解析接口浅析的更多相关文章
- [转] Spring4.3.x 浅析xml配置的解析过程(6)——解析context命名空间之property-placeholder和property-override标签
在上一篇解析自定义命名空间的标签中,我们已经知道解析自定义命名空间的标签需要用到NamespaceHandler接口的实现类,并且知道spring是如何获取命名空间对应的命名空间处理器对象的.因此我们 ...
- Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析
转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...
- WebService如何封装XML请求 以及解析接口返回的XML
原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...
- Android基础总结(12)——XML和JSON解析
XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- 【文件处理】xml 文件 DOM解析
一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实 ...
- Android解析XML之SAX解析器
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...
- xml之dom4j解析
* 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
随机推荐
- FOJ题目Problem 2082 过路费 (link cut tree边权更新)
Problem 2082 过路费 Accept: 382 Submit: 1279 Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- TNS-12555 / TNS-12560 / TNS-00525 Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPR
TNS-12555 / TNS-12560 / TNS-00525 Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPR ...
- 使用cxf3.0.4搭建webservice服务需要的最精简jar包
转自:https://blog.csdn.net/w1014074794/article/details/47862163 下面是测试结果,只列出报错了的测试: 1.org.apache.catali ...
- Api接口服务的设计和安全解决方案
这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 普通网站应 ...
- IIS之虚拟目录学习
从刚实习开始就了解到虚拟目录这个词,但是一直没去研究过什么意思,而且也没实际用过.一晃两年过去了,今天正好趁休息,补补脑学习下. 通过百度了解到,虚拟目录创建的目的是为了应对磁盘容量爆满,部署的网站不 ...
- 基于Socket的Winform例子
一.直接上效果图 二.Socket握手 三.服务端 Thread threadWatch = null;// 负责监听客户端的线程 Socket socketWatch = null;// 负责监听客 ...
- SpringBoot(八) Spring和消息队列RabbitMQ
概述 1.大多数应用中,可以通过消息服务中间件来提升系统异步能力和拓展解耦能力. 2.消息服务中的两个重要概念:消息代理(Message broker)和目的地(destination) 当消息发送者 ...
- HDU 3830 Checkers(二分+lca)
Description Little X, Little Y and Little Z are playing checkers when Little Y is annoyed. So he wan ...
- PHP的反射API
PHP5的类和对象并没有告诉我们类内的所有一切,而只是报告了他们的公共成员.要充分了解一个类,需要知道其私有 成员和保护成员,还要知道其方法所期望的参数,对此我们要使用API 1.获得反射API的转储 ...
- Eclipse中使用GIT将文件还原至上一版本
GIT将文件还原至上一版本: 选中文件——右击——Replace With——HEAD Revision: