作用就是输出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(见附件)。该例子的运行环境为:视窗
系统 XP Professional、JDK 1.3.1。为了能够正常编译运行Add
Record.java这个程式,你需要到网址
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。
方法三:使用TransformerFactory和Transformer类
在JAXP中所提供的标准的更新原始XML文件的方法就是调用XSLT引擎,亦即使用TransformerFactory和Transformer类。请看下面的Java代码片断:
//首先创建一个DOMSource对象,该构造函数的参数能是个Document对象
//doc代表更改后的DOM Tree。
DOMSource doms = new DOMSource (doc);
//创建一个File对象,代表DOM Tree所包含的数