Java更新XML的四种常用办法简介[Java编程]
本文“Java更新XML的四种常用办法简介[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本文扼要的谈论了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更新XML的四种常用办法简介[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |