选择显示字体大小

用java生成xml


  一般情况下,我们只要一提到xml,大多数问题都会集中到解析 xmlxml结构等方面。在这类技术领域,w3c提出了 dom 和 sax规范用来解析数据,sun提供了java xml pack,而 apache则推出了xerces 和xalan。然而,几乎没有什么关注的目光投射到输出xml这一问题上来。 把javabeans和swing组件变成 xml的项目倒有一些,但大多数情况下,开发人员只不过希望能用定制的格式输出数据结构,这个任务其实不难。

本文特别探讨了通过java创建xml文档的一些方法。我会具体提到好几种用java创建xml文档的方案。它们都各自具备不同的优点,有些很简单,有些则会依赖于某些强大的类库。下面我就从最简单的方法说起。

使用stringbuffer 类

最简单、同时也是最常用的xml文档创建方法就是自己动手。你可以采用stringbuffer 类或者某些writer 类。其优点是你不需要用到其他库,而且也不用创建多余的对象。可是,这一举措同时也带来了很多缺点。首当其冲的就是无法保证xml的格式正确性。字符在置入string 对象的时候必须仔细考虑。你得特别小心 xml实体的出现,比如用<取代〈等。 清单a 对此举例说明。

程序清单a 的输出结果是:

〈person name="jon smith" age="21"/〉

在这个简单的例子里,如果人名很古怪,比如jon "the cat" smith,那么输出格式就出问题了。这段代码在获取名字的时候没有处理引号,结果输出的代码就成了下面这样子,显然这种表示是错误的:

〈person name="jon "the cat" smith" age="21"/〉

在阅读源代码的时候很难跟踪隐藏在java内的 xml 。想反,这种开发措施中大约1半左右的错误都归结为没有封闭的标签和错误的引号处理,简而言之就形成了无效的xml

更明晰和简单的方法:dom

第2个办法就是dom,也就是所谓的文档对象模式(document object model)。在给定对象结构之后,你可以把它转换为某种格式的xml对象结构,然后输出结果。可用的结构类型很多,范围包括 jakarta element construction kit (ecs)项目的 xml类到完全遵守dom规范的解析器等,比如xerces,通常,版本越小输出xml的方法就越简单。清单b 就是一个采用ecs的例子。

清单b 提出了一种输出数据的简明办法。事实上,你可以把两个输出行合并为一个,方法是把output 方法附在新的xmldocument之后。这是一种采用ecs的有类语法模式,用起来方便之极。不过,这种方法不能很好地针对人员的年龄复制if-null 保护。为了实现这种保护,你必须采用清单c中的代码。

ecs 表现出了好几种优点,你不必避免引号字符(")。你也不需要完全封闭标签,对象会为你做这些工作的,任何xml字符,比如〈或者〉都被 < 和 >代替,ecs可谓最简单的dom方法。而用w3c的dom、jdom或者dom4j来处理这种风格的代码则更为复杂一些,当然,w3c的dom仍然具有独立解析的优点。

采用ecs输出xml的缺点包括了对象所引出的问题。你必须在写出内容之前建立对象。这样做在大多数情况下还是不错的,可你在输出大型xml文件的时候则不希望建立这种xml结构。同样的问题对其他大多数dom方法也存在。

比起简单地采用writers 或者 stringbuffer 类而言,ecs相当接近于一种标记。它的体积比较大,但只有很小一部分才用来输出xml。最大的问题是它的活动余地不大。它击败了其他同类型的方案,因为其他类型更大、更笨重而且更复杂。

sax

sax(simple api for xml)可以替代dom风格的 xml 解析。它由一系列事件或者代码在解析xml文件时所调用的回调函数组成。在你把结果直接输出到strings的情况下它并不能派多大的用场。但是,它可以用在间接的、更为复杂的方式下。

输出strings 的代码可以代替输出sax事件。这一招可比仅仅输出strings要高多了,它可以加入到一个简单的基类由其把sax事件转换为xml

让我们看看下面的例子,这个例子中使用了以下几个类:

person: 业务对象,先前已经进行了说明

personinputsource: 接纳person 对象

personxmlreader: 知道如何把personinputsource 转换为sax 事件

xmlprettyprinter: 把sax 事件转换为 xml的contenthandler

其中最重要的代码在personxmlreader内,如清单d所示。

清单 d 中的代码说明了 person 对象是如何被转换为一系列 sax 事件的。但这可不是个最简单的活。用sax把 person 转换为 xml 是通过清单e中的代码实现的。

采用sax 显然让你掌握了强大的计算能力,因为你可以在xml上附带sax解析器而没有采用xmlprettyprinter。但是,在增加处理器的时候也会增加复杂性; sax 是一种更复杂的概念。在多数情况下,简单的方法往往效果最佳。

一旦基本组件编写出来(xmlprettyprinter是一个基本inputsource,一个xmlparser 对象),产生事件就是小事一桩了。输出新的 xml 结构只需要 parse 方法和插入组件即可。

围绕sax 事件建立xml还不是一个快捷、便利的措施。

采用xmlwriter 类

最后我提出个自己的方案,这就是xmlwriter 类。我的思路是采用一种界于太简单和太复杂之间的技术来输出 xml

重要的设计需求如下:

封装java.io.writer

提供writer类的api

尽可能地处理xml

避免建立大型对象结构

允许 ecs链式风格

实现以上的这些需求可以让 xml 写成两种风格。首先,它可以用java.lang.writer 代码写出来,如清单f所示。

其次,它可以用链式方法的编码风格写成,这倒和ecs类似,因为每个write方法都返回 xmlwriter 自身。清单g 给出了这样的例子。

从性能角度上看,xmlwriter 具有一定的显著优势,它几乎没有创建其他对象。具有相当的功能性,可以处理基本的xml片段(但没有注释、缩排或者文档类型)。最重要的是,用起来很简单。

其负面问题已经提到过了,它不能处理注释、缩排或者文档类型。而ecs在 xml 对象写出自身时可以封闭标签,xmlwriter 需要你调用 endentity 方法。如果实体没有终止就调用该方法就会扔出 xmlwritingexception。最后,还有一个close 方法。它并不封闭writer对象,但会完成任何编写中的xml 。或许最重要的是,它会在实体没有终止的情况下扔出xmlwritingexception 。

小结

产生xml方法有好几种方法。xmlwriter 并不一定是最佳的xml创建工具,但是这种方法填补了太简单、太笨重乃至太复杂之间的鸿沟。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons