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. centOS+uwsgi+nginx 部署flask项目,问题记录

    用flask做的项目想要部署到centOS系统上,填了一些坑,终于成功了,记录一下遇到的问题: 此次部署主要是按照这个博客进行的 https://www.cnblogs.com/Ray-liang/p ...

  2. Crusher Django 学习笔记2 基本url配置

    http://crusher-milling.blogspot.com/2013/09/crusher-django-tutorial2-conf-basic-url.html 顺便学习一下FQ Cr ...

  3. Mysql5.7安装错误处理与主从同步及!

    basedir=/iddbs/mysql-5.7.16 datadir=/iddbs/mysql5.7/data3306 一.自定义Mysql.5.7版本免编译安装: 1.Db-server1安装前期 ...

  4. python 多继承(新式类) 三

    深入super 一下内容引用自:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html,写的挺好的. 代码段3 class ...

  5. linux分配文件文件夹所属用户及组

    ls -l 可以查看当前目录文件.如:drwxr-xr-x 2 nsf users 1024 12-10 17:37 下载文件备份分别对应的是:文件属性 连接数 文件拥有者 所属群组 文件大小 文件修 ...

  6. 用ssh-key-gen 在本地主机上创建公钥和密钥

    用ssh-key-gen 在本地主机上创建公钥和密钥 ligh@local-host$ ssh-keygen -t rsa

  7. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  8. H5移动端图片裁剪(base64)

    在移动端开发的过程中,或许会遇到对图片裁剪的问题.当然遇到问题问题,不管你想什么方法都是要进行解决的,哪怕是丑点,难看点,都得去解决掉. 图片裁剪的jquery插件有很多,我也测试过很多,不过大多数都 ...

  9. C# for循环的嵌套 作用域

    for() {   循环体可以套无数个for循环 } 比如:for() { for() { for() {... ...这里面可以镶嵌无数个for循环} } } 也可以这样 for() { for() ...

  10. 系统妈Win10系统64位和32位快速专业版

    win10系统64位快速专业安装版 V2016年 系统妈:http://www.xitongma.com/ Ghost Win10 64位正式装机专业版2016 微软向Windows用户推送了win1 ...