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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 提供了许多用于操作 XML 的 API,其比较常用的有 DOM、SAX 和 StAX。其,StAX 是一种基于流的 API,它提供了一种逐行读写 XML 文档的方式,适合于处理大型 XML 文件或数据流。 StAX API 定义了两个主要的类:XMLStreamReader 和 XMLStreamWriter。其XMLStreamWriter 是用于将 XML 文档输出到流的类。要使用 XMLStreamWriter 来输出 XML 文档,可以按照以下步骤进行: 1. 创建一个 XMLStreamWriter 对象,通常需要指定一个输出流作为参数。 2. 使用 XMLStreamWriter 写入 XML 文档的头部信息,例如文档类型、编码方式等。 3. 逐行写入 XML 元素和属性信息,可以使用 writeStartElement、writeAttribute、writeCharacters 等方法来完成。 4. 使用 XMLStreamWriter 写入 XML 文档的结尾信息,例如结束标签等。 5. 关闭 XMLStreamWriter 对象。 下面是一个简单的例子,演示了如何使用 XMLStreamWriter 将一个简单的 XML 文档输出到标准输出: ```java import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; public class StAXStreamWriterExample { public static void main(String[] args) throws Exception { // 创建输出流和 XMLStreamWriter 对象 OutputStream outputStream = System.out; Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); XMLOutputFactory factory = XMLOutputFactory.newInstance(); XMLStreamWriter xmlWriter = factory.createXMLStreamWriter(writer); // 写入 XML 头部信息和根元素 xmlWriter.writeStartDocument("UTF-8", "1.0"); xmlWriter.writeStartElement("books"); // 写入子元素和属性信息 xmlWriter.writeStartElement("book"); xmlWriter.writeAttribute("id", "1"); xmlWriter.writeStartElement("name"); xmlWriter.writeCharacters("Java Programming"); xmlWriter.writeEndElement(); xmlWriter.writeEndElement(); // 写入根元素的结束标签 xmlWriter.writeEndElement(); // 关闭 XMLStreamWriter 和输出xmlWriter.close(); writer.close(); } } ``` 上面的代码将输出以下 XML 文档: ```xml <?xml version='1.0' encoding='UTF-8'?> <books> <book id="1"> <name>Java Programming</name> </book> </books> ``` 通过使用 XMLStreamWriter,我们可以较为方便地将 XML 文档输出到流,并且可以按照需要逐行输出元素和属性信息,非常适合处理大型的 XML 数据流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值