Java中XML的输出

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

Xerces

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

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,DOMLevel 2 Core Recommendation来支持XML1.0.

JOX

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

JaxMe

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

XMLConfigReader

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

JVoiceXML

JVoiceXML一个开源的VoiceXML解析器.

Woodstox

Woodstox是一个快速开源且符合StAX(STreamingApi 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文档的相互转换,并能够为Javaclass生成XML schema定义。

X2JB

X2JB是一个Java开发类包用于把XML映射成Java实体。实际上它与JAXB、XML Beans、JakartaCommons 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节点数据,一下就达到了目的。

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

有一种旅行,叫单车旅行。它没有奢侈准备,

Java中XML的输出

相关文章:

你感兴趣的文章:

标签云: