dom4j學習總結(二)

來源:互聯網
上載者:User
文章目錄
  • remove
  • appendContent
 dom4j學習總結(二)

(一)移除節點及屬性

    /** *//**移除節點和屬性的操作
     * @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節點
        Element book_society=(Element)document.selectSingleNode("//book[@type='society']");
        root.remove(book_society);
        System.out.println("1。正確的刪除了類型為society的book節點");
        System.out.println(document.asXML());
        
        //刪除sex節點
        Element sex=(Element)root.selectSingleNode("//sex");
        
        //從root節點刪除
        root.remove(sex);
        System.out.println("2。這樣是不能刪除sex節點的");
        System.out.println(document.asXML());
        
        //從author節點刪除
        root.element("author").remove(sex);
        System.out.println("3。這樣就可以正確刪除sex節點");
        System.out.println(document.asXML());
        
        //刪除屬性
        Attribute type=root.element("book").attribute("type");
        root.element("book").remove(type);
        System.out.println("4。正確刪除book節點的type屬性");
        System.out.println(document.asXML());
    }

輸出結果為:

1。正確的刪除了類型為society的book節點
<?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節點的
<?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節點
<?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節點的type屬性
<?xml version="1.0" encoding="UTF-8"?>
<root><book><Name>Java</Name><price>100</price></book><author><name>chb</name></author></root>

分析:

第二個輸出結果不能刪除sex節點,我們需要看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只能用在它自己的直接孩子節點上,不能用在孫子節點上,因為sex節點不是root節點的直接孩子節點,所以不能刪除;而sex節點卻是author節點的直接孩子節點,所以第三個輸出可以刪除。

(二)將兩個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節點,添加到doc_book的根結點
        Element author=(Element)doc_author.selectSingleNode("//author");
        doc_book.getRootElement().add(author);
        System.out.println(doc_book.asXML());
    }

調用CombineDocument函數,會出現以下錯誤:

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節點已經有一個root節點了,不能再添加到另一個節點上去。

(2)使用appendContent()方法

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

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

輸出結果為:

<?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節點,只是把author節點的子節點添加上去了,但是由此可見,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("//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>

是正確結果

(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"));
        //當前author尚無父節點,所以可以使用add方法添加
        doc_book.getRootElement().add(author);

        System.out.println(doc_book.asXML());
    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.