java xml 合并_Java中合并XML文档的设计与实现
為了讀寫XML文件,需要導(dǎo)入如下JAVA包,"//"后為注釋說明,筆者的環(huán)境是JDK1.3.1,在JDK 1.4.0中測試也通過。
Import java.io. *; //Java基礎(chǔ)包,包含各種IO操作
Import java.util. *; //Java基礎(chǔ)包,包含各種標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)操作
Import javax.xml.parsers. *; //XML解析器接口
Import org.w3c.dom. *; //XML的DOM實(shí)現(xiàn)
import org.apache.crimson.tree.XmlDocument;//寫XML文件要用到
Import javax.xml.transform. *;
Import javax.xml.transform.dom. *;
Import javax.xml.transform.stream. *;
下面介紹合并XML文檔的過程。先說明一下各個方法的作用。方法isMerging()有兩個參數(shù)
(分別是目標(biāo)XML文件名和被合并的XML文件名),調(diào)用JAVA的解析器,獲得兩個要合并的XML文
檔的Document結(jié)構(gòu)和根元素,并調(diào)用方法duplicate()和方法write To()。當(dāng)然,在XML文檔
的合并過程中,可以加入另外的一些判斷條件,比如,當(dāng)被合并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); //出現(xiàn)異常時,輸出異常信息
}
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 ();
//下面添加被合并文件根節(jié)點(diǎn)下的每個元素
Novelist message Items = root_vice.getChildNodes ();
Int item_number = messageItems.getLength ();
//如果去掉根節(jié)點(diǎn)下的第一個元素,比如,那么i從3開始。否則i從1開始。
For (int i=1; i < item_number; i=i+2 ) {
//調(diào)用dupliate(),依次復(fù)制被合并XML文檔中根節(jié)點(diǎn)下的元素。
Element messageItem = (Element) messageItems.item (i);
IsOver = dupliate (doc_main, root_main, messageItem);
}
//調(diào)用 write To(),將合并得到的Document寫入目標(biāo)XML文檔。
Boolean isWritten = write To (doc_main, mainFileName);
Return isOver && isWritten;
}
方法dupliate ()有三個參數(shù)(分別是目標(biāo)XML文檔的Document,目標(biāo)XML文檔中要添加節(jié)
點(diǎn)的父節(jié)點(diǎn)和被合并XML文檔的復(fù)制節(jié)點(diǎn)),采用遞歸的形式,將一個XML文檔中的元素復(fù)制到
另一個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);
//復(fù)制節(jié)點(diǎn)的屬性
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);
//復(fù)制節(jié)點(diǎn)的值
Textvalue 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);
//復(fù)制子結(jié)點(diǎn)
Novelist sub_messageItems = son.getChildNodes ();
int sub_item_number = sub_messageItems.getLength();
if (sub_item_number < 2){
//如果沒有子節(jié)點(diǎn),則返回
Is done = true;
}
Else {
For (int j = 1; j < sub_item_number; j=j+2) {
//如果有子節(jié)點(diǎn),則遞歸調(diào)用本方法
Element sub_messageItem = (Element) sub_messageItems.item (j);
Is done = dupliate (doc_dup, subITEM, sub_messageItem);
}
}
Return is done;
}
方法writeTo()有兩個參數(shù)(分別是目標(biāo)XML文檔的Document和文件名),將所得目標(biāo)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;
}
最后使用測試函數(shù)進(jìn)行測試。對于兩個已經(jīng)存在的XML文件(比如,存在文件D:/a.xml和
D:/b.xml,要將b.xml合并到a.xml中),可以測試如下:
Publicstatic voidmain (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 NOTbeen merged.");
}
總結(jié)
本文介紹了如何利用JAVA中的XML解析器,合并兩個XML文檔。當(dāng)然,在合并的過程中,還
可以加入其他的約束條件,比如要求過濾掉特定的元素等。另外,復(fù)制元素的插入位置也可以
加以限制。
總結(jié)
以上是生活随笔為你收集整理的java xml 合并_Java中合并XML文档的设计与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怪物猎人世界boss顺序是什么
- 下一篇: 机械革命极光 Pro 游戏本上架:12