[转]XML解析框架

原文地址:[url]http://blog.csdn.net/NowhereFish/article/details/5648770[/url]

XML 是一种网络通信的数据交换的重要公共语言,它能非常方便的描述带层级关系的数据结构并方便的进行扩充。在 Java 中操作 XML 是相当方便的,于是我调查了一些时下比较流行的 Java 操作 XML 的开源库

[b]Xerces[/b]
Xerces 是由 Apache 组织所推动的一项 XML 文档解析开源项目 , 它目前有多种语言版本包括 JAVA 、 C++ 、 PERL 、 COM 等。

[b]JDOM[/b]
JDOM 是一种面向 Java 的读、写和操作 XML 文档的 API 。 JDOM 与现行的 SAX 和 DOM 标准兼容,为 Java 程序员提供了一个简单、轻量的 XML 文档操作方法。由于 JDOM 是专门为 Java 程序员开发的,所以采用许多 Java 语言的优秀特性,比如方法重载、集合 (Collections) 和类映射 (Reflection) 。

[b]dom4j[/b]
Dom4j 是一个易用的、开源的库,用于 XML , XPath 和 XSLT 。它应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM , SAX 和 JAXP 。

[b]XOM[/b]
XOM 虽然也是一种面向对象的 XML API ,类似于 DOM 的风格,但是它有一些与众不同的特性比如严格保持内存中对象的不变性,从而使 XOM 实例总是能序列化为正确的 XML 。此外,与其他 Java XML API 相比, XOM 追求更简单和更正规。

[b]JiBX[/b]
JiBX 是一个为 Java 提供的 XML 数据绑定框架。它可以和现存的类一起运行,使用一个灵活的映射定义文件来决定如何将数据对象转换成 XML 。

[b]KXML[/b]
KXML 是一个只占很小存储空间的 XML 语法分析程序,对于 J2ME 应用程序非常适合。它有一个非常独特的 DOM 操作方法和被称为 Pull 的语法分析方法。它有以下性能:  
· 支持 XML 名称空间   
· 用 " 松散 " 模式分析 HTML 或其它 SGML 格式   
· 占用很少的存储空间( 21 kbps )   
· 基于 Pull 的分析   
· 支持 XML 写操作   
· 可选的 DOM 支持   
· 可选的 WAP 支持

[b]XMLBeans[/b]
XMLBeans 是一个 XML-Java 绑定工具,利用它可以很方便地解析 XML 文档。 Eclipse 支持插件: xmlbeansplug( 在线更新地址 ) 。

[b]jConfig[/b]
因为 properties 的局限性,有时候得使用 XML 文件来定义应用的配置参数, jConfig 正是这样一个读写 XML 配置文件的工具。开发者在 Java 程序中只需要使用 get/set 方法就能读取修改 XML 文件中的配置参数。 jConfig 目前只支持两层结构,最新版本为 2.3 。

[b]XStream[/b]
XStream 使用起来非常简单,不需要预先生成相关的辅助类,不需要映射文件。当然,使用简单也注定了它只能处理简单结构的 XML 文件。

[b]XJR[/b]
一个 XML 的 Java 绑定框架,它的主要特点是不需要映射文件,用 XJRDTDCompiler 直接通过 DTD 文件生成 Java 文件,也可以用 XJRDTDCreator 对 Java 类处理生成 DTD 文件。当然也有不足,就是还不支持 Schema 。

[b]Piccolo XML Parser[/b]
Piccolo 是利用 java 快速解析 XML 文档的开源项目。它实现 SAX 1, SAX 2.0.1, and JAXP 1.1 接口作为一个( Non-validating )非验证剖析器。

[b]NanoXML[/b]
NanoXML 是一个能在 CLDC 环境下运行的开放源代码非确认性 ( 不做验证工作直接进行解析 ) 的 XML 分析器。 Nanoxml 是一步解析器(非常小 6KB 的 XML 解析器 ) ,一次就把文档解析完并以一个树状的结构传回。

[b]XP Parser[/b]
XP 是一个 Java 开发的 XML1.0 解析器 . 它当前是一个非验证解析器 , 然而它可以解析所有外部实休 : 外部 DTD 子集 , 外部参数实体 , 普通的外部实体 .

[b]Commons-Digester[/b]
Digester 基于规则的 XML 文档解析 , 主要用于 XML 到 Java 对象的映射 .

[b]NunniMJAX[/b]
NunniMJAX 是一个 Java 非验证 XML 解析器。它的 APIs 与功能类似于 SAX. 这意味着你如果熟悉 SAX 你将很容易掌握这个解析器。

[b]Crimson[/b]
Crimson 是一个基于 Java 的 XML 解析器 . 它通过 JAXP1.1,SAX2.0,SAX2 扩展版本 1.0,DOM Level 2 Core Recommendation 来支持 XML1.0.

[b]JOX[/b]
JOX 是一组 Java 类库 , 它使得在 XML 文档与 Java Beans 之间进行数据转换变得容易 . 你可以把 JOX 想象成 Java 对象序列化 (Java Object Serialization) 的一个种特殊形式 , 利用 XML 作为序列化的格式 .

[b]JaxMe[/b]
JaxMe 是对 JAXB(Java/XML 绑定规范 ) 的一种开放源代码实现。它对基本的 JAXB 规范作了一些改进之外并且集成了数据库和 Enterprise JavaBeans.

[b]XMLConfigReader[/b]
XMLConfigReader 是对 Java ResourceBundle 类的一个开源扩展 . 利用它可以直接从 XML 文件中读取配置数据并把数据存储在一个 HashTable 中 .

[b]JVoiceXML[/b]
JVoiceXML 一个开源的 VoiceXML 解析器 .

[b]Woodstox[/b]
Woodstox 是一个快速开源且符合 StAX(STreaming Api for Xml processing) 规范的 XML 处理器 ( 做为一个处理器意味着它可以处理输入 ( 相当于解析 ) 与输出 ( 相当于写入 , 序列化 )) 。

[b]xalan[/b]
xalan- java 是一套 xslt 处理器,用来将 XML 文件转换为 HTML,TEXT 和 XML 等其他类型文件格式。支持 XSLT1.0 和 XPATH 1.0 版。开发人员可以通过命令行方式或在 JAVA APPLET 和 SERVLET 中使用,并可以作为自己开发的应用程序的类库使用。 xalan-java 实现的是 transformation API for XML(TRaX) 接口,此接口为 jaxp1.2 标准中的一部分。

[b]XmlIO[/b]
XmlIO 是一个利用 SAX 来解析 XML 然后创建 Java 对象并同时调用这些对象 setter 方法的框架 . 这个框架还能够把一张包含有单个根节点的 Java 对象图序列化成 XML 格式的字符串。

[b]VTD-XML[/b]
VTD-XML 是一种新的 XML 处理 API, 它能够克服 DOM 和 SAX 的一些问题。 VTD-XML 能够在内存中对 XML 进行快速检查并提供 XPath 查询支持。 在它的主页上有详细的 API 描述,源代码,文档和例子。

[b]Nux[/b]
Nux 是一个开源的 Java 工具,它能够让 XML 高效处理变得容易。 Nux 可嵌入到具有高吞吐量的 XML 消息中间件中比如:大型 p2p 底层结构 , 消息队列 , 发布 - 订阅和 Blogs/ 新闻聚合的 matchmaking 系统 , 分布式系统,防火墙等. Nux 集成并扩展 XOM,Saxon 和 Lucene 这些优秀的开源组件包以提供 XQuery/XPath, 全文本搜索等功能。

[b]StAX[/b]
StAX(Streaming API for XML) 是标准的 XML 处理 API, 它能够从应用程序的 stream 对象解析 XML 数据或把 XML 数据转换成 stream 对象。 StAX 是一个用 Java 实现的 XML 拉式解析器。

[b]Skaringa[/b]
Skaringa 提供一个类库实现 Java object 与 XML 文档的相互转换 , 并能够为 Java class 生成 XML schema 定义。

[b]X2JB[/b]
X2JB 是一个 Java 开发类包用于把 XML 映射成 Java 实体。实际上它与 JAXB 、 XML Beans 、 Jakarta Commons Digester 等相似但没有它们复杂。 X2JB 使用注释( annotation )来映射 XML 元素和元素属性。

[b]Smooks[/b]
Smooks 用于处理 XML 与非 XML(CSV , EDI , Java 等 ) 的一个 Java 框架与引擎。 Smooks 能够用于各种数据格式的转换: XML to XML , CSV to XML , EDI to XML , XML to EDI , XML to CSV , Java to XML , Java to EDI , Java to CSV , Java to Java , XML to Java , EDI to Java 等。

[b]WAX[/b]
WAX 是一个用于创建大型 XML 文档的高效工具。与其它 XML 操作类库(如 JDOM )相比,它占用的内存比较少。创建 XML 所需要的代码也比较少。只关注创建功能,而没有读取 / 解析功能。整个类库只有 12K 左右。特别适合用于创建基于 REST 或 SOAP Web Service 的请求与响应信息。

[b]Simple framework[/b]
Simple 是一个高性的 XML 序列化和配置框架。它提供完整的对象序列化与反序列化功能,并能够保持它们的关联关系。 Simple 与 C# 的 XML 序列化相似,但增加了拦截和操作等功能。

[b]xmlzen[/b]
Light-weight 是一个 Java 工具用于解析 XML 和 DOM 构建。

[b]Xmappr[/b]
Xmappr 提供一种非常简单的方式来处理 XML ,可以将任意 XML 与 Java 类相映射。映射通过注释或外部配置实现。可以缓存未映射元素,保持 XML 元素顺序。可以自定义类型转换器,线程安全(设计用于多线程使用),没有依赖第三方类库。整个类库大小只有 80kb 。

[b]Castor[/b]
Castor 是 ExoLab Group 下面的一个开放源代码的项目,它主要实现的是 O/R 映射功能。



介绍了这么多 XMl 的框架,其实也都是大同小异,基本的解析流程也就是 DOM 和 SAX 两种方式,可是哪一种最适合我的需求呢?

简单来说,我希望用 XML 来描述一种树形结构,且树的子节点是不确定的。如下所示:

<Node> 
<Node/>
<Node>
<Node/>
<Node/>
<Node/>
</Node>
</Node>

经人推荐,我首先尝试了一下 XStream 和 Castor ,这是两个使用比较广泛的实现 XML 和实体对象对应的工具。我的基本想法是用一个对象来与一个节点对应,对象中有一个 list 成员,来指向所有的儿子节点,一旦是叶子节点,则 list 成员为 null 。经过半天的尝试,无论是更改成员 list 的类型还是重写其中的 Converter 接口,都无法达到父节点下直接有很多子节点的效果,即显示结果一定是:

<Node> 
<list>
<Node/>
<Node>
<list>
<Node/>
<Node/>
<Node/>
</list>
</Node>
</list>
</Node>


即所有的容器成员,一定会产生一个节点。后来想想也对,这种 XML 库的目的就是为了实现实体和 XML 之间的对应关系,去掉了那个 list 节点,则丢失了过对的信息无法还原出原来实体的状态,违背了他的初衷。于是改用 dom4j ,直接用递归的方式递归树形结构,填写 XML 节点数据,一下就达到了目的。

总的来说对以上 XML 开源库的选取要合理的针对你选择的目标,到底是进行一般性 XML 的生成,还是为了实现 Object 和 XML 之间的序列化或者映射。如果是后者的话 XStream 是一个非常不错的选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值