国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java中合并XML文檔的設(shè)計(jì)與實(shí)現(xiàn)

2019-11-18 11:04:55
字體:
供稿:網(wǎng)友
摘 要:介紹了xml應(yīng)用中合并XML文檔的方法與應(yīng)用,在基于XML的應(yīng)用中,有著廣泛的應(yīng)用前景。

  要害詞:XML文檔 解析器 元素

   在XML應(yīng)用中,最常用也最實(shí)用的莫過于XML文件的讀寫。由于XML語義比較嚴(yán)格,起始標(biāo)記必須配對(duì),所以合并XML文檔并不像合并普通文件那樣簡單。在java中,如何合并XML文檔,下面介紹一種方法。

  設(shè)計(jì)思想

   應(yīng)用javax.xml.parsers包中的解析器解析得到兩個(gè)XML文件的根元素,再采用遞歸的方式逐一復(fù)制被合并文件的元素。

Java中合并XML文檔的設(shè)計(jì)與實(shí)現(xiàn)


  實(shí)現(xiàn)過程

   為了讀寫XML文件,需要導(dǎo)入如下JAVA包,"http://"后為注釋說明,筆者的環(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文檔的過程。先說明一下各個(gè)方法的作用。方法isMerging()有兩個(gè)參數(shù)(分別是目標(biāo)XML文件名和被合并的XML文件名),調(diào)用JAVA的解析器,獲得兩個(gè)要合并的XML文檔的Document結(jié)構(gòu)和根元素,并調(diào)用方法duplicate()和方法write To()。當(dāng)然,在XML文檔的合并過程中,可以加入另外的一些判定條件,比如,當(dāng)被合并XML文檔不存在時(shí),將如何處理,等等。

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)異常時(shí),輸出異常信息
  }
  Document doc_main = null,doc_vice= null;
  //獲取兩個(gè)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);
  }
  //獲取兩個(gè)文件的根元素。
  Element root_main = doc_main.getDocumentElement ();
  Element root_vice = doc_vice.getDocumentElement ();
  //下面添加被合并文件根節(jié)點(diǎn)下的每個(gè)元素
  Novelist message Items = root_vice.getChildNodes ();
  Int item_number = messageItems.getLength ();
  //假如去掉根節(jié)點(diǎn)下的第一個(gè)元素,比如<所屬治理系統(tǒng)>,那么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 ()有三個(gè)參數(shù)(分別是目標(biāo)XML文檔的Document,目標(biāo)XML文檔中要添加節(jié)點(diǎn)的父節(jié)點(diǎn)和被合并XML文檔的復(fù)制節(jié)點(diǎn)),采用遞歸的形式,將一個(gè)XML文檔中的元素復(fù)制到另一個(gè)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()有兩個(gè)參數(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)行測試。對(duì)于兩個(gè)已經(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解析器,合并兩個(gè)XML文檔。當(dāng)然,在合并的過程中,還可以加入其他的約束條件,比如要求過濾掉特定的元素等。另外,復(fù)制元素的插入位置也可以加以限制。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新竹市| 福州市| 张家川| 闵行区| 视频| 六枝特区| 外汇| 南宁市| 肇东市| 湛江市| 建平县| 三原县| 安多县| 南川市| 东平县| 新绛县| 永川市| 辽阳县| 通道| 徐州市| 龙川县| 板桥市| 嘉定区| 郧西县| 清镇市| 历史| 拉萨市| 三原县| 揭西县| 顺昌县| 东乌珠穆沁旗| 霞浦县| 加查县| 苏州市| 留坝县| 昌黎县| 宝清县| 丹棱县| 钟祥市| 老河口市| 聂荣县|