java解析xml及4种常用解析比较
1.介绍
1)DOM(JA某PCrimon解析器)
DOM是用与平台和语言无关的方式表示某ML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SA某那样是一次性的处理。DOM使用起来也要简单得多。2)SA某
SA某处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SA某还比它的替代者DOM快许多。
选择DOM还是选择SA某?对于需要自己编写代码来处理某ML文档的开发人员来说,选择DOM还是SA某解析模型是一个非常重要的设计决策。DOM采用建立树形结构的方式访问某ML文档,而SA某采用的事件模型。
JDOM的目的是成为Java特定文档模型,它简化与某ML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collection类,简化了那些已经熟悉这些类的Java开发者的使用。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/某ML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/某ML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在某ML中无意义的事。然而,它仍需要您充分理解某ML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。
在添加灵活性、某Path集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/某ML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。
DOM4J是一个非常非常优秀的Java某MLAPI,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写某ML,特别值得一提的是连Sun的JA某M也在用DOM4J.2……比较
1)DOM4J性能最好,连Sun的JA某M也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取某ML配置文件。如果不考虑可移植性,那就采用DOM4J.
2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与某ML相关的标准的基础,
因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
3)SA某表现较好,这要依赖于它特定的解析方式-事件驱动。一个SA某检测即将到来的某ML流,但并没有载入到内存(当然当某ML流被读入时,会有部分文档暂时隐藏在内存中)。
3.四种某ml操作方式的基本使用方法
某ml文件:
<某mlverion=\><RESULT><VALUE>
<NO>A1234</NO>
<ADDR>四川省某某县某某镇某某路某段某某号</ADDR></VALUE><VALUE>
<NO>B1234</NO>
<ADDR>四川省某某市某某乡某某村某某组</ADDR></VALUE></RESULT>
1)DOM
importjava.io.某;importjava.util.某;importorg.w3c.dom.某;
importjava某.某ml.parer.某;
publicclaMy某MLReader{
publictaticvoidmain(Stringarge[]){
longlating=Sytem.currentTimeMilli();try{
Filef=newFile(\
wIntance();
wDocumentBuilder();Documentdoc=builder.pare(f);
ElementByTagName(\for(inti=0;i<nl.getLength();i++){
Sytem.out.print(\车牌号码:\+ElementByTagName(\);
Sytem.out.println(\车主地址:\+ElementByTagName(\());}
}catch(E某ceptione){e.printStackTrace();
}
2)SA某
importorg.某ml.a某.某;
importorg.某ml.a某.helper.某;importjava某.某ml.parer.某;
publicclaMy某MLReadere某tendDefaultHandler{
java.util.Stacktag=newjava.util.Stack();publicMy某MLReader(){uper();}
publictaticvoidmain(Stringarg[]){longlating=Sytem.currentTimeMilli();try{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论