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. 洛谷 P2231 [HNOI2002]跳蚤

    https://www.luogu.org/problemnew/show/P2231 题意相当于:有n个位置a[1..n],每个位置可以填[1,m]中任一个整数,问共有多少种填法满足gcd(a[1] ...

  2. Hibernate-Session使用的背后

    一.Session缓存的介绍 简单说,缓存介于应用程序和数据库之间,是临时存放数据的内存区域,作用是减少对数据库的访问次数,从而提高应用程序的运行性能.Session有一个缓存,也叫hibernate ...

  3. 转 PHP界面显示中文乱码

    D:\wamp64\trainning\testD:\wamp64\www\practice php 页面前端显示乱码 在写一个表单提交的项目中,遇到了PHP界面输出无法显示中文界面. 后来查阅相关资 ...

  4. 简单了解junit的使用

    普通使用: 在没有用测试框架之前,我们要用一个main方法来跑代码,而有了像junit这样的测试框架后,就可以不用次次写个main方法了. 直接上代码,注释里有说明: package com.stuP ...

  5. 移动端 mui框架中input输入框或任何输入框聚焦后页面自动上移

    一.mui框架中点击input后,安卓手机弹出自带的输入键盘时,页面自动上移 实现方法: (1)只要把input标签放在mui-content这个类里面就可以了 <div class=" ...

  6. asp.net调试技巧

    一眨眼的功夫,自己已经学习asp.net的有一年的功夫了.虽然称不上什么大神,但是也有一点知识的积累.就写一片调试的入门文章给那些刚刚入门迷茫的童鞋们.希望你学习了我这篇文章能从迷茫的生活中找回编程的 ...

  7. WPF学习04:2D绘图 使用Shape绘基本图形

    我们将使用Shape进行基本图形绘制. 例子 一个可移动的矩形方框: XAML代码: <Window x:Class="Shape.MainWindow" xmlns=&qu ...

  8. 关于js对象中的,属性的增删改查问题

    删除主要是delet方法: 1 function Person(){}; 2 var person = new Person(); 3 person.name = 'yy'; 4 person.gen ...

  9. uvm_driver——老司机带带我

    文件:src/comps/uvm_driver.svh类: uvm_driver uvm_driver继承(C++中叫继承)自uvm_component,其中定义了两个Ports:seq_item_p ...

  10. IOS之constraints

    anyway, you can do this with auto layout. You can do it entirely in IB as of Xcode 5.1. Let's start ...