Posted on 2006-09-07 15:25
boddi 閱讀(1001)
評論(0) 編輯 收藏
Java中合并XML文檔的設計與實現
作者: 凌宗虎 李先國
出處: 計算機與信息技術
責任編輯: 方舟
[ 2005-06-09 08:39 ]
摘 要:介紹了XML應用中合并XML
文檔的方法與應用,在基于XML的應用中,有著廣泛的應用前景。
關鍵詞:XML文檔 解析器 元素
在XML應用中,最常用也最實用的莫過于
XML文件的讀寫。由于XML語義比較嚴格,起始標記必須配對,所以合并XML文檔并不像合并普通文件那樣簡單。在JAVA中,如何合并XML文檔,下面介紹一種方法。
設計思想 應用
javax.xml.parsers包中的解析器解析得到兩個XML文件的根元素,再采用
遞歸的方式逐一復制被合并文件的元素。
實現過程 為了讀寫XML文件,需要
導入如下JAVA包,"http://"后為注釋說明,筆者的環境是
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文檔。當然,在合并的過程中,還可以加入其他的約束條件,比如要求過濾掉特定的元素等。另外,復制元素的插入位置也可以加以限制。