选择显示字体大小

java更新xml的四种常用方法简介(1)

本文简要的讨论了java语言编程中更新xml文档的四种常用方法,并且分析这四种方法的优劣。其次,本文还对如何控制java程序输出的xml文档的格式做了展开论述。

jaxp是java api for xml processing的英文字头缩写,中文含义是:用于xml文档处理的使用java语言编写的编程接口。jaxp支持dom、sax、xslt等标准。为了增强jaxp使用上的灵活性,开发者特别为jaxp设计了一个pluggability layer,在pluggability layer的支持之下,jaxp既可以和具体实现dom api、sax api 的各种xml解析器(xml parser,例如apache xerces)联合工作,又可以和具体执行xslt标准的xslt处理器(xslt processor,例如apache xalan)联合工作。

应用pluggability layer的好处在于:我们只需要熟悉jaxp各个编程接口的定义即可,而不需要对所采用的具体的xml解析器、xslt处理器有很深入的了解。比如在某个java程序中,通过jaxp调用xml解析器apache crimson对xml文档进行处理,如果我们希望使用别的xml解析器(比如apache xerces),以便提高该程序的性能,那么原程序代码可能不需要任何改变,直接就可以使用(你所需要做的事情只是将包含apache xerces代码的jar文件加入到环境变量classpath中,而将包含apache crimson代码的jar文件在环境变量classpath中删除)。

目前jaxp已经应用的十分普遍了,可以说是java语言中处理xml文档的标准api。有些初学者在学习使用jaxp的过程中,经常会提出这样的问题:我编写的程序对dom tree做了更新,但是当程序退出以后,原始的xml文档并没有改变,还是老样子,如何实现对原始xml文档和dom tree的同步更新呢?咋一看来,在jaxp中似乎没有提供相应的接口/方法/类,这是很多初学者都感到困惑的问题。

本文的主旨就在于解决这个问题,简单的介绍几种常用的同步更新原始xml文档和dom tree的方法。为了缩小讨论的范围,本文所涉及的xml解析器仅包括apache crimson和apache xerces,而xslt处理器仅仅使用apache xalan。

方法一:直接读写xml文档

这也许是最笨最原始的办法了。当程序获取dom tree之后,应用dom模型的node接口的各个方法对dom tree进行更新,下一步应该对原始的xml文档进行更新了。我们可以运用递归的办法或者是应用treewalker类,遍历整个dom tree,与此同时,将dom tree的每一个节点/元素依次写入到预先打开的原始xml文档中,当dom tree被遍历完全之后,dom tree和原始的xml文档就实现了同步更新。实际中,这个方法极少使用,不过如果你要编程实现自己的xml解析器,这种方法还是有可能用得上的。

方法二:使用xmldocument类

使用xmldocument类?jaxp中分明没有这个类呀!是不是作者搞错了?没有错!就是使用xmldocument类,确切的说,是使用xmldocument类的write()方法。

在上文已经提到过,jaxp可以和各种各样的xml解析器联合使用,这次我们选用的xml解析器是apache crimson。xmldocument(org.apache.crimson.tree.xmldocument)是apache crimson的一个类,并不包含于标准的jaxp中,难怪在jaxp的文档中找不到xmldocument类的芳踪呢。现在问题出来了,如何应用xmldocument类来实现更新xml文档的功能?在xmldocument类中提供了下面三个write()方法(根据crimson最新的版本------apache crimson 1.1.3):

public void write (outputstream out) throws ioexception

public void write (writer out) throws ioexception

public void write (writer out, string encoding) throws ioexception

上述三个write()方法的主要作用就是输出dom tree中的内容到特定的输出介质中,比如文件输出流、应用程序控制台等等。那么又如何使用上述三个write()方法呢?请看下面的java程序代码片断:

 string name="fancy";

documentbuilder parser;

documentbuilderfactory factory = documentbuilderfactory.newinstance();

try

{

parser = factory.newdocumentbuilder();

document doc = parser.parse("user.xml");

element newlink=doc.createelement(name);

doc.getdocumentelement().appendchild(newlink);

((xmldocument)doc).write(new fileoutputstream(new file("xuser1.xml")));

}

catch (exception e)

{

//to log it

}

在上面的代码中,首先创建了一个document对象doc,获取完整的dom tree,然后应用node接口的appendchild()方法,在dom tree的最后追加了一个新节点(fancy),最后调用xmldocument类的write(outputstream out)方法,把dom tree中的内容输出到xuser.xml中(其实也可以输出到user.xml,更新原始的xml文档,在这里为了便于做对比,故而输出到xuser.xml文件中)。需要注意的是不能直接对document对象doc直接调用write()方法,因为jaxp的document接口并没有定义任何write()方法,所以必须将doc由document对象强制转换为xmldocument对象,然后才能调用write()方法,在上面的代码中使用的是write(outputstream out)方法,这个方法使用缺省的utf-8编码输出dom tree中的内容到特定的输出介质中,如果dom tree中包含中文字符,那么输出的结果有可能是乱码,亦即存在所谓的"汉字问题",解决的办法是使用write (writer out, string encoding)方法,显式指定输出时的编码,例如将第二个参数设为"gb2312",这时即不存在"汉字问题",输出结果能够正常显示中文字符。

完整的例子请参考下列文件: addrecord.java(见附件)、user.xml(见附件)。该例子的运行环境为:windows xp professional、jdk 1.3.1。为了能够正常编译运行addrecord.java这个程序,你需要到网址http://xml.apache.org/dist/crimson/去下载apache crimson,并将所获取的crimson.jar文件加入到环境变量classpath中。

注意:

apache crimson的前身是sun project x parser,后来不知何故,由x parser演变为apache crimson,至今apache crimson的很多代码都是从x parser中直接移植过来的。比如上文用到的xmldocument类,它在x parser中是com.sun.xml.xmldocument,到了apache crimson中摇身一变,就变成了org.apache.crimson.tree.xmldocument类,其实它们的绝大部分代码是一样的,可能就package语句和import语句以及文件开头的一段lience有所不同而已。早期的jaxp是和x parser捆绑在一起的,因此一些老的程序使用了com.sun.xml包,如果你现在重新编译它们,有可能不能通过,肯定就是因为这个原因。后来的jaxp和apache crimson捆绑在一起,比如jaxp 1.1,如果你使用jaxp 1.1,那么不需要额外下载apache crimson,也能够正常编译运行上面的例子(addrecord.java)。最新的jaxp 1.2 ea(early access)改弦更张,采用性能更好的apache xalan和apache xerces分别作为xslt处理器和xml解析器,不能直接支持apache crimson了,所以如果你的开发环境采用了jaxp 1.2 ea或者是java xml pack(内含jaxp 1.2 ea),那么将无法直接编译运行上面的例子(addrecord.java),你需要额外下载并安装apache crimson。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

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