Java中合并XML文档的设计与实现(一)

2014-11-23 21:43:30 · 作者: · 浏览: 19
  摘 要:介绍了XML应用中合并XML文档的方法与应用,在基于XML的应用中,有着广泛的应用前景。

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

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

   设计思想

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


   实现过程

   为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK1.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文档的过程。先说明一下各个方法的作用。方法isMerging()有两个参数(分别是目标XML文件名和被合并的XML文件名),调用JAVA的解析器,获得两个要合并的XML文档的Document结构和根元素,并调用方法duplicate()和方法write To()。当然,在XML文档的合并过程中,可以加入另外的一些判断条件,比如,当被合并XML文档不存在时,将如何处理,等等。

Private Boolean is Merging (String mainFileName, String subFilename) 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). GetNodeva lue ();
    SubITEM.setAttribute (attribute_name, attribute_value);
   }
  }
  Father.appendChild (sub ITEM);
  //复制节点的值
  Textvalue son = (Text) son.getFirstChild ();
  String nodeva lue_root = "";
  If (value_son! = null && value_son.getLength () >0) nodeva lue_root = (String) value_son.getNodeva lue ();
  Text valuenode_root = null;
  If ((nodeva lue_root! = null)&&(nodeva lue_root.length () >0)) valuenode_root = doc_dup.createTextNode (nodeva lue_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 = (Elem