StAX
StAX(Streaming API for XML) 是标准的 XML 处理 API, 它能够从应用程序的 stream 对象解析 XML 数据或把 XML 数据转换成 stream 对象。 StAX 是一个用 Java 实现的 XML 拉式解析器。
Skaringa
Skaringa 提供一个类库实现 Java object 与 XML 文档的相互转换 , 并能够为 Java class 生成 XML schema 定义。
X2JB
X2JB 是一个 Java 开发类包用于把 XML 映射成 Java 实体。实际上它与 JAXB 、 XML Beans 、 Jakarta Commons Digester 等相似但没有它们复杂。 X2JB 使用注释( annotation )来映射 XML 元素和元素属性。
Smooks
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 等。
WAX
WAX 是一个用于创建大型 XML 文档的高效工具。与其它 XML 操作类库(如 JDOM )相比,它占用的内存比较少。创建 XML 所需要的代码也比较少。只关注创建功能,而没有读取 / 解析功能。整个类库只有 12K 左右。特别适合用于创建基于 REST 或 SOAP Web Service 的请求与响应信息。
Simple framework
Simple 是一个高性的 XML 序列化和配置框架。它提供完整的对象序列化与反序列化功能,并能够保持它们的关联关系。 Simple 与 C# 的 XML 序列化相似,但增加了拦截和操作等功能。
xmlzen
Light-weight 是一个 Java 工具用于解析 XML 和 DOM 构建。
Xmappr
Xmappr 提供一种非常简单的方式来处理 XML ,可以将任意 XML 与 Java 类相映射。映射通过注释或外部配置实现。可以缓存未映射元素,保持 XML 元素顺序。可以自定义类型转换器,线程安全(设计用于多线程使用),没有依赖第三方类库。整个类库大小只有 80kb 。
Castor
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 节点数据,一下就达到了目的。