Java中合并XML文檔 設計與實現

來源:互聯網
上載者:User

摘 要:介紹了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文檔。當然,在合并的過程中,還可以加入其他的約束條件,比如要求過濾掉特定的元素等。另外,複製元素的插入位置也可以加以限制。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.