<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一輩子的程序員?

    愛你一生不變-芳芳!
    posts - 27, comments - 15, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Java中合并XML文檔的合并

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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲第一区精品观看| 成年女人18级毛片毛片免费 | 免费在线观看自拍性爱视频| 中国在线观看免费高清完整版| 亚洲欧洲日本国产| 在线永久看片免费的视频| 亚洲另类春色国产精品| 成人免费午夜无码视频| 亚洲AV成人影视在线观看| 免费被黄网站在观看| 国产亚洲蜜芽精品久久| 免费a级黄色毛片| 国产无遮挡色视频免费观看性色| 亚洲码国产精品高潮在线| 久久久99精品免费观看| 亚洲理论精品午夜电影| 国产精品成人免费视频网站京东| 亚洲欧美国产欧美色欲 | 亚洲一区二区精品视频| 久久最新免费视频| 日韩亚洲AV无码一区二区不卡| 2021国产精品成人免费视频| 亚洲乱理伦片在线观看中字| 亚洲片国产一区一级在线观看| 美女被cao网站免费看在线看| 亚洲成人福利网站| 免费一级一片一毛片| 青柠影视在线观看免费高清| 亚洲一区二区三区播放在线 | 免费毛片在线看不用播放器| 亚洲人成电影在线天堂| 大香人蕉免费视频75| 一级a性色生活片久久无少妇一级婬片免费放 | 亚洲成AV人片在线观看无码| 美女网站免费福利视频| 无人视频免费观看免费视频| 亚洲国产精品热久久| 国产在线19禁免费观看| 99热在线观看免费| 人人爽人人爽人人片A免费| 亚洲毛片免费观看|