DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比
2016-07-25 21:02
489 查看
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
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
相关文章推荐
- 最美公式:世上最伟大的十个公式
- 几乎零配置产生Nuget包的库:White Tie
- [LeetCode练习题-C语言]203. Remove Linked List Elements
- Linux运维学习历程-第二天-虚拟机的配置
- 清除confluent 在zookeeper中的数据
- Android socket通信 readline方法阻塞
- 异常捕获
- Ubuntu下安装Python
- 开始语
- 330. Patching Array
- 卷积神经网络问题总结
- Java Super 覆盖方法
- Hibernate二 映射 注解 一级缓存
- <hdu - 1280> 前M大的数 (注意其中的细节)
- 编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。
- hdu1251 统计难题(Trie树入门题)
- 关于卡尔曼滤波本质解释和公式推到
- LetNet5卷积参数理解
- vbs - 一个简单的栈 -- 只能存储类对象
- ubuntu安装软件apt-get