文章作者 100test 发表时间 2007:09:06 11:52:42
来源 100Test.Com百考试题网
public void write (OutputStream out) throws IOException public void write (Writer out) throws IOException public void write (Writer out, String encoding) throws IOException |
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。
方法三:使用TransformerFactory和Transformer类
在JAXP中所提供的标准的更新原始XML文档的方法就是调用XSLT引擎,亦即使用TransformerFactory和Transformer类。请看下面的Java代码片断:
//首先创建一个DOMSource对象,该构造函数的参数可以是一个Document对象 //doc代表更改后的DOM Tree。 DOMSource doms = new DOMSource (doc). //创建一个File对象,代表DOM Tree所包含的数据的输出介质,这是一个XML文件。 File f = new File ("XMLOutput.XML"). //创建一个StreamResult对象,该构造函数的参数可以取为File对象。 StreamResult sr = new StreamResult (f). //下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文件中的功能。 //XSLT引擎的输入为DOMSource对象,输出为StreamResut对象。 try { //首先创建一个TransformerFactory对象,再由此创建Transformer对象。Transformer //类相当于一个XSLT引擎。通常我们使用它来处理XSL文件,但是在这里我们使 //用它来输出XML文档。 TransformerFactory tf=TransformerFactory.newInstance(). Transformer t=tf.newTransformer (). //关键的一步, 调用Transformer对象 (XSLT引擎)的transform()方法,该方法的第一 //个参数是DOMSource对象,第二个参数是StreamResult对象。 t.transform(doms,sr). } catch (TransformerConfigurationException tce) { System.out.println("Transformer Configuration Exception\n-----"). tce.printStackTrace(). } catch (TransformerException te) { System.out.println ("Transformer Exception\n---------"). te.printStackTrace (). } |
//首先创建一个TransformerFactory对象,再由此创建Transformer对象。 TransformerFactory tf=TransformerFactory.newInstance(). Transformer t=tf.newTransformer (). //获取Transformser对象的输出属性,亦即XSLT引擎的缺省输出属性,这是一个 //Java.util.Properties对象。 Properties properties = t.getOutputProperties(). //设置新的输出属性:输出字符编码为GB2312,这样可以支持中文字符,XSLT引擎所输出 //的XML文档如果包含了中文字符,可以正常显示,不会出现所谓的"汉字问题"。 //请留意OutputKeys类的字符串常数OutputKeys.ENCODING。 properties.setProperty(OutputKeys.ENCODING,"GB2312"). /更新XSLT引擎的输出属性。 t.setOutputProperties(properties). //调用XSLT引擎,按照输出属性中的设置,输出DOM Tree中的内容到输出介质中。 t.transform(DOMSource_Object,StreamResult_Object). |
public static final Java.lang.String METHOD |
public static final Java.lang.String VERSION |
public static final Java.lang.String ENCODING |
public static final Java.lang.String OMIT_XML_DECLARATION |
<?XML version="1.0" standalone="yes" encoding="utf-8" ?> |
public static final Java.lang.String INDENT |
public static final Java.lang.String MEDIA_TYPE |
Properties properties = transformer.getOutputProperties(). |
properties.setProperty(OutputKeys.ENCODING,"GB2312"). properties.setProperty(OutputKeys.METHOD,"html"). properties.setProperty(OutputKeys.VERSION,"4.0"). ……………………………………………………… |
方法四:使用Xalan XML Serializer
方法四其实是方法三的一个变种,它需要Apache Xalan和Apache Xerces的支持才能够运行。例子代码如下所示:
//首先创建一个DOMSource对象,该构造函数的参数可以是一个Document对象 //doc代表更改后的DOM Tree。 DOMSource domSource = new DOMSource (doc). //创建一个DOMResult对象,临时保存XSLT引擎的输出结果。 DOMResult domResult = new DOMResult(). //下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文件中的功能。 //XSLT引擎的输入为DOMSource对象,输出为DOMResut对象。 try { //首先创建一个TransformerFactory对象,再由此创建Transformer对象。Transformer //类相当于一个XSLT引擎。通常我们使用它来处理XSL文件,但是在这里我们使 //用它来输出XML文档。 TransformerFactory tf=TransformerFactory.newInstance(). Transformer t=tf.newTransformer (). //设置XSLT引擎的属性(必不可少,否则会产生"汉字问题")。 Properties properties = t.getOutputProperties(). properties.setProperty(OutputKeys.ENCODING,"GB2312"). t.setOutputProperties(properties). //关键的一步, 调用Transformer对象 (XSLT引擎)的transform()方法,该方法的第一 //个参数是DOMSource对象,第二个参数是DOMResult对象。 t.transform(domSource,domResult). //创建缺省的Xalan XML Serializer,使用它将临时存放在DOMResult对象 //(domResult)中的内容以输出流的形式输出到输出介质中。 Serializer serializer = SerializerFactory.getSerializer (OutputProperties.getDefaultMethodProperties("XML")). //设置Xalan XML Serializer的输出属性,这一步必不可少,否则也可能产生 //所谓的"汉字问题"。 Properties prop=serializer.getOutputFormat(). prop.setProperty("encoding","GB2312"). serializer.setOutputFormat(prop). //创建一个File对象,代表DOM Tree所包含的数据的输出介质,这是一个XML文件。 File f = new File ("xuser3.XML"). //创建文件输出流对象fos,请留意构造函数的参数。 FileOutputStream fos=new FileOutputStream(f). //设置Xalan XML Serializer的输出流。 serializer.setOutputStream(fos). //串行化输出结果。 serializer.asDOMSerializer().serialize(domResult.getNode()). } catch (Exception tce) { tce.printStackTrace(). } |
相关文章
JDK1.5新特性介绍
利用Java技术开发Web网络课件浅议
用Java实现HTTP文件队列下载
Java编程中更新XML文档的常用方法
JXTAPlatformJAVA参考实现源代码分析系列文章(2)
JBuilder WebLogic实现教材管理系统
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛