1. DOM(Document Object Model)文档对象模型
1. DOM是W3C指定的一套规范标准,核心是按树形结构处理数据,DOM解析器读入XML文件并在内存中建立一个结构一模一样的“树,树各节点和XML各标记对应,通过操纵此“树”来处理XML中的文件, DOM可以读取XML也可以向XML文件中插入数据。相对来说,编程容易,开发人员只需要调用建树的指令,然后利用APIs访问所需的树节点来完成任务。

使用DOM我们可以指定要访问的元素进行随机访问,随意修改文件树,从而修改XML文件。尤其是向前处理时非常容易。(双向)

2. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。但可移植。

2.SAX(Simple API for XML)用于XML的简单API

1. SAX是基于事件驱动(所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法)的。SAX以类似于流的形式读取XML文件,分析能够立即开始,而不是等待所有的数据被处理,也就是说读入文档的过程和解析的过程是同时进行的。SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现指定的TAG的时候,可以激活一个回调方法,告诉该方法指定的标签已经找到。当某个事件被触发时,才获取相应的XML的部分数据,需要编程者手动处理所有的事件。甚至不必解析整个文档,它可以在某个条件得到满足时停止解析。从而不管XML文件有多大,都只占用了少量的内存空间。效率比较高。

2. SAX只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。

SAX的另一个缺点:因为事件触发是有时序性的,所以SAX分析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再重新倒回去处理。此外,单向导航很难同时访问同一文档的不同部分数据。同DOM分析器相比,SAX分析器对XML文档的处理缺乏灵活性。

3. JDOM

1. JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”,极大减少了代码量。

DOM, SAX是解析xml的底层接口。而JDOM和DOM4J则是基于底层API的更高级封装 。DOM是通用的,而JDOM和DOM4J则是面向java语言的。

JDOM是处理XML的纯Java API,使用具体类而不是接口。JDOM是基于树的处理XML的Java API,把树加载到内存中,同时又有SAX的Java规则。

JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Java集合类,便于Java开发者使用。

JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。

2. 缺点是不能处理大于内存的文档。性能较差。还有就是灵活性较差。但可移植。

4. DOM4J

1. DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和容易使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。

DOM4J大量使用接口,有更复杂的API,所以DOM4J比JDOM有更大的灵活性,支持XPath。DOM4J性能最好。如果不考虑可移植性,优先使用DOM4J。

大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。

2. API过于复杂。

5. PULL

1. PULL解析XML在Android中用到的比较多,而且PULL技术已经被集成到Android系统中,所以在使用PULL的时候不需要额外引入到jar。Android中要是使用上述的四种方式,需要引入额外的jar,当然JavaEE中使用PULL技术进行解析的话,就需要引入PULL所需的jar了。

其实PULL技术和SAX技术差不多,Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:

SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束,而Pull解析器的工作方式为允许你的应用程序代码从解析器中主动获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,前者实例调用newPullParser方法创建后者实例,接着后者实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。
而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件,开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等,但需要调用next()方法提取它们(主动提取事件)。

6. 总结

如果XML文档较大且不考虑移植性问题建议采用DOM4J;如果XML文档较小则建议采用JDOM;如果需要及时处理而不需要保存数据则考虑SAX。

本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52027484

DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比的更多相关文章

  1. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

  2. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  3. Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J

    Java 四种解析 XML 的特点 1.DOM 解析: 形成了树结构,有助于更好的理解.掌握,且代码容易编写. 解析过程中,树结构保存在内存中,方便修改. 2.SAX 解析: 采用事件驱动模式,对内存 ...

  4. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  5. XML文件解析-DOM4J方式和SAX方式

    最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...

  6. 用DOM4J包实现对xml文件按属性分离。

    转自本人博客:http://www.xgezhang.com/dom4j_xml_separata.html dom4j是一个Java的XML API.类似于jdom.用来读写XML文件的. dom4 ...

  7. XML文件解析之JDOM解析

    1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2 ...

  8. xml解析之使用dom4j的api对xml文件进行CRUD(二)

    在使用dom4j的api对xml文件进行CRUD(一)见博客http://blog.csdn.net/qq_32059827/article/details/51524330的基础上,再对做一次练习. ...

  9. Android之旅十四 android中的xml文件解析

    在我们做有关android项目的时候,肯定会涉及到对xml文件的解析操作.以下给大家介绍一下xml文件的解析.包括DOM.SAX.Pull以及曾经我们用到的DOM4J和JDOM: 要解析的XML文件: ...

随机推荐

  1. SecureCRT无法连接虚拟机Linux—虚拟网卡(NAT方式)IP(169.254.xx.xx)无效问题

    搞了一晚上,终于解决了http://blog.csdn.net/zengxianyang/article/details/50394809

  2. springMVC-接收数据-参数绑定

    接收数据-参数绑定 #Method Arguments概观 Same in Spring WebFlux The table below shows supported controller meth ...

  3. 090 Subsets II 子集 II

    给定一个可能包含重复整数的列表,返回所有可能的子集(幂集).注意事项:解决方案集不能包含重复的子集.例如,如果 nums = [1,2,2],答案为:[  [2],  [1],  [1,2,2],  ...

  4. 剑指offer部分编程题

    一 斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 问题分析: 可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有 ...

  5. 需求管理是CMM可重复级中的6个关键过程域之一,其主要目标是__________。A.客观地验证需求管理活动

    需求管理是CMM可重复级中的6个关键过程域之一,其主要目标是__________.A.客观地验证需求管理活动       需求管理是CMM可重复级中的6个关键过程域之一,其主要目标是_________ ...

  6. arcgis jsapi接口入门系列(10):图形高亮

    jsapi也有提供高亮的实现接口,但这里没用,而用的是一种改变图形(graphic)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...

  7. Oracle中查询和定位数据库问题的SQL语句

    --1)查询和定位数据库问题的SQL语句--Oracle常用性能监控SQL语句.sql --1查询锁表信息 select vp.SPID, vs.P1, vs.P1RAW, vs.P2, vs.EVE ...

  8. leecode 旋转数组

    描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋 ...

  9. Java调用存储过程出现Bug,sql语法错误

    因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.

  10. centos7设置sshd端口,firewall,selinux设置

    https://blog.csdn.net/qq_31927797/article/details/81095829 #停止firewallsystemctl stop firewalld.servi ...