?dom4j學(xué)習(xí)總結(jié)(二)

          (一)移除節(jié)點(diǎn)及屬性

          ???? /** 移除節(jié)點(diǎn)和屬性的操作
          ?????*?
          @throws ?DocumentException
          ?????
          */

          ????
          public ? void ?RemoveOperator()? throws ?DocumentException {
          ????????
          // 待生成xml的字符串
          ????????String?str = " <root><book?type='science'><Name>Java</Name><price>100</price></book> "
          ????????????
          + " <book?type='society'><Name>Society?security</Name><price>130</price></book> "
          ????????????
          + " <author><name>chb</name><sex>boy</sex></author></root> " ;
          ????????
          // 生成一個Document
          ????????Document?document? = ?DocumentHelper.parseText(str);
          ????????
          ????????Element?root
          = document.getRootElement();
          ????????
          // 刪除類型為society的book節(jié)點(diǎn)
          ????????Element?book_society = (Element)document.selectSingleNode( " //book[@type='society'] " );
          ????????root.remove(book_society);
          ????????System.out.println(
          " 1。正確的刪除了類型為society的book節(jié)點(diǎn) " );
          ????????System.out.println(document.asXML());
          ????????
          ????????
          // 刪除sex節(jié)點(diǎn)
          ????????Element?sex = (Element)root.selectSingleNode( " //sex " );
          ????????
          ????????
          // 從root節(jié)點(diǎn)刪除
          ????????root.remove(sex);
          ????????System.out.println(
          " 2。這樣是不能刪除sex節(jié)點(diǎn)的 " );
          ????????System.out.println(document.asXML());
          ????????
          ????????
          // 從author節(jié)點(diǎn)刪除
          ????????root.element( " author " ).remove(sex);
          ????????System.out.println(
          " 3。這樣就可以正確刪除sex節(jié)點(diǎn) " );
          ????????System.out.println(document.asXML());
          ????????
          ????????
          // 刪除屬性
          ????????Attribute?type = root.element( " book " ).attribute( " type " );
          ????????root.element(
          " book " ).remove(type);
          ????????System.out.println(
          " 4。正確刪除book節(jié)點(diǎn)的type屬性 " );
          ????????System.out.println(document.asXML());
          ????}

          輸出結(jié)果為:

          1。正確的刪除了類型為society的book節(jié)點(diǎn)
          <?xml version="1.0" encoding="UTF-8"?>
          <root><book type="science"><Name>Java</Name><price>100</price></book><author><name>chb</name><sex>boy</sex></author></root>
          2。這樣是不能刪除sex節(jié)點(diǎn)的
          <?xml version="1.0" encoding="UTF-8"?>
          <root><book type="science"><Name>Java</Name><price>100</price></book><author><name>chb</name><sex>boy</sex></author></root>
          3。這樣就可以正確刪除sex節(jié)點(diǎn)
          <?xml version="1.0" encoding="UTF-8"?>
          <root><book type="science"><Name>Java</Name><price>100</price></book><author><name>chb</name></author></root>
          4。正確刪除book節(jié)點(diǎn)的type屬性
          <?xml version="1.0" encoding="UTF-8"?>
          <root><book><Name>Java</Name><price>100</price></book><author><name>chb</name></author></root>

          分析:

          第二個輸出結(jié)果不能刪除sex節(jié)點(diǎn),我們需要看dom4j的API

          remove

          public boolean remove(Element?element)
          Removes the given Element if the node is an immediate child of this branch. If the given node is not an immediate child of this branch then the Node.detach()method should be used instead.

          Parameters:
          element - is the element to be removed
          Returns:
          true if the element was removed

          從中我們可以看出,remove只能用在它自己的直接孩子節(jié)點(diǎn)上,不能用在孫子節(jié)點(diǎn)上,因?yàn)閟ex節(jié)點(diǎn)不是root節(jié)點(diǎn)的直接孩子節(jié)點(diǎn),所以不能刪除;而sex節(jié)點(diǎn)卻是author節(jié)點(diǎn)的直接孩子節(jié)點(diǎn),所以第三個輸出可以刪除。

          (二)將兩個Document合并為一個Document

          先看一個錯誤的情況

          (1)使用add()方法添加

          public ? void ?CombineDocument()? throws ?DocumentException {
          ????????
          // 待生成兩個Document的字符串
          ????????String?str_book = " <root><book?type='science'><Name>Java</Name><price>100</price></book> "
          ????????????
          + " <book?type='society'><Name>Society?security</Name><price>130</price></book> "
          ????????????
          + " </root> " ;
          ????????String?str_author
          = " <root><author><name>chb</name><sex>boy</sex></author></root> " ;
          ????????
          ????????
          // 生成兩個Document
          ????????Document?doc_book = DocumentHelper.parseText(str_book);
          ????????Document?doc_author
          = DocumentHelper.parseText(str_author);
          ????????
          ????????
          // 取出doc_author的author節(jié)點(diǎn),添加到doc_book的根結(jié)點(diǎn)
          ????????Element?author = (Element)doc_author.selectSingleNode( " //author " );
          ????????doc_book.getRootElement().add(author);
          ????????System.out.println(doc_book.asXML());
          ????}

          調(diào)用CombineDocument函數(shù),會出現(xiàn)以下錯誤:

          org.dom4j.IllegalAddException: The node "org.dom4j.tree.DefaultElement@17bd6a1 [Element: <author attributes: []/>]" could not be added to the element "root" because: The Node already has an existing parent of "root"
          ?at org.dom4j.tree.AbstractElement.addNode(AbstractElement.java:1521)
          ?at org.dom4j.tree.AbstractElement.add(AbstractElement.java:1002)
          ?at xml_chb.dom4j_chb.CombineDocument(dom4j_chb.java:189)
          ?at xml_chb.dom4j_chb.main(dom4j_chb.java:199)
          Exception in thread "main"

          即提示author節(jié)點(diǎn)已經(jīng)有一個root節(jié)點(diǎn)了,不能再添加到另一個節(jié)點(diǎn)上去。

          (2)使用appendContent()方法

          即將doc_book.getRootElement().add(author);

          改為:doc_book.getRootElement().appendContent(author);

          輸出結(jié)果為:

          <?xml version="1.0" encoding="UTF-8"?>
          <root>
          <book type="science"><Name>Java</Name><price>100</price></book>
          <book type="society"><Name>Society security</Name><price>130</price></book>
          <name>chb</name><sex>boy</sex>
          </root>

          可以看出,缺少了author節(jié)點(diǎn),只是把a(bǔ)uthor節(jié)點(diǎn)的子節(jié)點(diǎn)添加上去了,但是由此可見,appendContent方法是有希望的。

          我們看一下dom4j的API:

          appendContent

          public void appendContent(Branch?branch)
          Appends the content of the given branch to this branch instance. This method behaves like the Collection.addAll(java.util.Collection) method.

          Parameters:
          branch - is the branch whose content will be added to me.

          (3)使用正確的appendContent方法

          將:Element author=(Element)doc_author.selectSingleNode("http://author");

          doc_book.getRootElement().appendContent(author);

          改為:doc_book.getRootElement().appendContent(doc_author.getRootElement());

          輸出:

          <?xml version="1.0" encoding="UTF-8"?>
          <root>
          <book type="science"><Name>Java</Name><price>100</price></book>
          <book type="society"><Name>Society security</Name><price>130</price></book>
          <author><name>chb</name><sex>boy</sex></author>
          </root>

          是正確結(jié)果

          (4)另一種可行的方法

          public ? void ?CombineDocument()? throws ?DocumentException {
          ????????
          // 待生成兩個Document的字符串
          ????????String?str_book = " <root><book?type='science'><Name>Java</Name><price>100</price></book> "
          ????????????
          + " <book?type='society'><Name>Society?security</Name><price>130</price></book> "
          ????????????
          + " </root> " ;
          ????????String?str_author
          = " <root><author><name>chb</name><sex>boy</sex></author></root> " ;
          ????????
          ????????
          // 生成兩個Document
          ????????Document?doc_book = DocumentHelper.parseText(str_book);
          ????????Document?doc_author
          = DocumentHelper.parseText(str_author);
          ????????
          ????????
          // 新生成一個Document
          ????????Element?author = DocumentHelper.createElement( " author " );
          ????????author.appendContent((Element)doc_author.selectSingleNode(
          " //author " ));
          ????????
          // 當(dāng)前author尚無父節(jié)點(diǎn),所以可以使用add方法添加
          ????????doc_book.getRootElement().add(author);

          ????????System.out.println(doc_book.asXML());
          ????}
          posted on 2006-09-24 23:41 揚(yáng)州夢 閱讀(261) 評論(0)  編輯  收藏 所屬分類: java

          統(tǒng)計(jì)

          主站蜘蛛池模板: 禹州市| 灵台县| 贡觉县| 江门市| 宜丰县| 方正县| 西充县| 富裕县| 卢湾区| 平阳县| 平远县| 武威市| 怀仁县| 尉犁县| 扎赉特旗| 驻马店市| 横峰县| 五寨县| 冕宁县| 偃师市| 桦川县| 思茅市| 广昌县| 比如县| 丽水市| 江西省| 临洮县| 兰考县| 梁平县| 汾西县| 铜鼓县| 什邡市| 河北区| 建湖县| 绥德县| 惠安县| 治县。| 佛坪县| 富源县| 前郭尔| 长子县|