DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> Java中合並XML文檔的設計與實現
Java中合並XML文檔的設計與實現
編輯:XML詳解     
摘 要:介紹了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文檔。當然,在合並的過程中,還可以加入其他的約束條件,比如要求過濾掉特定的元素等。另外,復制元素的插入位置也可以加以限制。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved