网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java语言编程中更新xml文档的常用方法集     
  文章作者:未知  文章来源:水木森林  
  查看:76次  录入:管理员--2007-11-17  
 
  本文简要的讨论了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",这时即不存在"汉字问题",输出结果能够正常显示中文字符。
  
  该例子的运行环境为: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 ();
  }
  
  在实际的应用中,我们可以应用传统的dom api从xml文档中获取dom tree,然后根据实际的需求对dom tree执行各种操作,得到最终的document对象,接下来可以由此document对象创建domsource对象,剩下的事情就是照搬上面的代码了,程序运行完毕后,xmloutput.xml就是你所需要的结果(当然了,你可以随意更改streamresult类构造函数的参数,指定不同的输出介质,而不必是千篇一律的xml文档)。
  
  这个方法最大的好处在于可以随心所欲的控制dom tree中的内容输出到输出介质中的格式,但是光靠transformerfactor
 
 
上一篇: java与xml联合编程    下一篇: 初学者入门java的xml编程实例解析
  相关文档
在java中利用jcom实现仿excel编程详解 11-17
进阶:j2me程序开发全方位基础讲解汇总 02-02
教您如何用zeus实现xml-java的数据绑定 11-17
ejb轻松进阶之八 11-16
hibernate 实例学习笔记 11-17
applet与servlet通讯的四种方法及其比较 11-17
java网络编程之uri、url研究专题二 11-17
2005年java十大热点问题揭晓 11-17
awt机器人robot 11-16
filesystem 属性 11-16
java中日期的使用方法 11-17
flex开发步骤——配置过程总结 11-17
java入门及faq__1(4) 11-17
使用java实现在文件中添加字符串 11-17
j2ee的发展历程 11-16
ejb技术之旅(三) 11-16
实现java平台的三种方式 11-17
java入门:java多线程程序设计详细解析 01-09
jboss下数据源密码加密 11-17
论java加密技术与windows的结合 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息