Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>JAVA与XML>>Java中合并XML文档的设计与实现
Java中合并XML文档的设计与实现
2005-06-09   来源:计算机与信息技  作者:凌宗虎 李先国
  摘 要:介绍了XML应用中合并XML文档的方法与应用,在基于XML的应用中,有着广泛的应用前景。

  关键词:XML文档 解析器 元素

  在XML应用中,最常用也最实用的莫过于XML文件的读写。由于XML语义比较严格,起始标记必须配对,所以合并XML文档并不像合并普通文件那样简单。在JAVA中,如何合并XML文档,下面介绍一种方法。

  设计思想

  应用javax.xml.parsers包中的解析器解析得到两个XML文件的根元素,再采用递归的方式逐一复制被合并文件的元素。


  实现过程

  为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK 1.3.1,在JDK 1.4.0中测试也通过。

Import java.io. *; //Java基础包,包含各种IO操作
Import java.util. *; //Java基础包,包含各种标准数据结构操作
Import javax.xml.parsers. *; //XML解析器接口
Import org.w3c.dom. *; //XML的DOM实现
import org.apache.crimson.tree.XmlDocument;//写XML文件要用到
Import javax.xml.transform. *;
Import javax.xml.transform.dom. *;
Import javax.xml.transform.stream. *;

  下面介绍合并XML文档的过程。先说明一下各个方法的作用。方法is Merging()有两个参数(分别是目标XML文件名和被合并的XML文件名),调用JAVA的解析器,获得两个要合并的XML文档的Document结构和根元素,并调用方法duplicate()和方法write To()。当然,在XML文档的合并过程中,可以加入另外的一些判断条件,比如,当被合并XML文档不存在时,将如何处理,等等。

Private Boolean is Merging (String mainFileName, String sub Filename) throws Exception {
 Boolean isOver = false;
 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 Document Builder db = null;
 Try {
  Db = dbf.newDocumentBuilder ();
 } Catch (ParserConfigurationException pce) {
  System.err.println(pce); //出现异常时,输出异常信息
 }
 Document doc_main = null,doc_vice = null;
 //获取两个XML文件的Document。
 Try {
  Doc_main = db.parse (mainFileName);
  Doc_vice = db.parse (sub Filename);
 } Catch (DOM Exception dom) {
  System.err.println (dom.getMessage ());
 } Catch (Exception ioe) {
  System.err.println (ioe);
 }
 //获取两个文件的根元素。
 Element root_main = doc_main.getDocumentElement ();
 Element root_vice = doc_vice.getDocumentElement ();
 //下面添加被合并文件根节点下的每个元素
 Novelist message Items = root_vice.getChildNodes ();
 Int item_number = messageItems.getLength ();
 //如果去掉根节点下的第一个元素,比如<所属管理系统> ,那么i从3开始。否则i从1开始。
 For (int i=1; i < item_number; i=i+2 ) {
  //调用dupliate(),依次复制被合并XML文档中根节点下的元素。
  Element messageItem = (Element) messageItems.item (i);
  IsOver = dupliate (doc_main, root_main, messageItem);
 }
 //调用 write To(),将合并得到的Document写入目标XML文档。
 Boolean isWritten = write To (doc_main, mainFileName);
 Return isOver && isWritten;
}

  方法dupliate ()有三个参数(分别是目标XML文档的Document,目标XML文档中要添加节点的父节点和被合并XML文档的复制节点),采用递归的形式,将一个XML文档中的元素复制到另一个XML文档中。

Private Boolean dupliate (Document doc_dup, Element father, Element son) throws Exception {
 Boolean is done = false;
 String son_name = son.getNodeName ();
 Element sub ITEM = doc_dup.createElement (son_name);
 //复制节点的属性
 If (son.hasAttributes ()){
  NamedNodeMap attributes = son.getAttributes ();
  For (int i=0; i < attributes.getLength () ; i ++){
   String attribute_name = attributes. Item (i). GetNodeName ();
   String attribute_value = attributes. Item (i). GetNodeValue ();
   SubITEM.setAttribute (attribute_name, attribute_value);
  }
 }
 Father.appendChild (sub ITEM);
 //复制节点的值
 Text value son = (Text) son.getFirstChild ();
 String nodevalue_root = "";
 If (value_son! = null && value_son.getLength () > 0) nodevalue_root = (String) value_son.getNodeValue ();
 Text valuenode_root = null;
 If ((nodevalue_root! = null)&&(nodevalue_root.length () > 0)) valuenode_root = doc_dup.createTextNode (nodevalue_root);
 If (valuenode_root! = null && valuenode_root.getLength () > 0) subITEM.appendChild (valuenode_root);
 //复制子结点
 Novelist sub_messageItems = son.getChildNodes ();
 int sub_item_number = sub_messageItems.getLength();
 if (sub_item_number < 2){
  //如果没有子节点,则返回
  Is done = true;
 }
 Else {
  For (int j = 1; j < sub_item_number; j=j+2) {
   //如果有子节点,则递归调用本方法
   Element sub_messageItem = (Element) sub_messageItems.item (j);
   Is done = dupliate (doc_dup, subITEM, sub_messageItem);
  }
 }
 Return is done;
}

  方法writeTo()有两个参数(分别是目标XML文档的Document和文件名),将所得目标XML文档写入文件。

Private Boolean write To (Document doc, String fileName) throws Exception {
 Boolean isOver = false;
 DOM Source doms = new DOM Source (doc);
 File f = new File (fileName);
 Stream Result sr = new Stream Result (f);
 Try
 {
  Transformer Factory tf=TransformerFactory.newInstance ();
  Transformer t=tf.newTransformer ();
  Properties properties = t.getOutputProperties ();
  Properties.setProperty (OutputKeys.ENCODING,"GB2312");
  T.setOutputProperties (properties);
  T.transform (doms, sr);
  IsOver = true;
 }
 Catch (TransformerConfigurationException tce)
 {
  Tce.printStackTrace ();
 }
 Catch (Transformer Exception te)
 {
  Te.printStackTrace ();
 }
 Return isOver;
}

  最后使用测试函数进行测试。对于两个已经存在的XML文件(比如,存在文件D:/a.xml和D:/b.xml,要将b.xml合并到a.xml中),可以测试如下:

Public static void main (String [] args) throws Exception {
 Boolean is done = is Merging ("D:/a.xml","D:/b.xml");
 If (is Done) System.out.println ("XML files have been merged.");
 Else System.out.println ("XML files have NOT been merged.");
}

  总结

  本文介绍了如何利用JAVA中的XML解析器,合并两个XML文档。当然,在合并的过程中,还可以加入其他的约束条件,比如要求过滤掉特定的元素等。另外,复制元素的插入位置也可以加以限制。
  --相关文章--
· Java与XML联合编程之DOM篇 (2005-08-22)
· Java与XML联合编程 (2005-08-22)
· Java与XML联合编程之SAX篇 (2005-08-22)
· 高手进阶篇:Jive中Jdom使用方法解析 (2005-08-22)
· XSLT轻松入门第二章:XSLT的实例 (2005-08-20)
· XSLT轻松入门第一章:XSLT概念 (2005-08-20)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接