黑马程序员技术交流社区

标题: 归纳Java中XML的输出 [打印本页]

作者: 梦回唐朝    时间: 2013-8-25 22:27
标题: 归纳Java中XML的输出

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

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

XOM

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

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

KXML

KXML 是一个只占很小存储空间的 XML 语法分析程序,对于 J2ME 应用程序非常适合。它有一个非常独特的 DOM 操作方法和被称为 Pull 的语法分析方法。它有以下性能:  

· 支持 XML 名称空间   

· 用 " 松散 " 模式分析 HTML 或其它 SGML 格式   

· 占用很少的存储空间( 21 kbps )   

· 基于 Pull 的分析   

· 支持 XML 写操作   

· 可选的 DOM 支持   

· 可选的 WAP 支持

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

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

XStream

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

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

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

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

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

Commons-Digester


Digester 基于规则的 XML 文档解析 , 主要用于 XML 到 Java 对象的映射 .

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

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

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

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

XMLConfigReader

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

JVoiceXML
JVoiceXML 一个开源的 VoiceXML 解析器 .

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

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

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

VTD-XML


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

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

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 节点数据,一下就达到了目的。


作者: 许庭洲    时间: 2013-8-27 19:15
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2