文章目錄
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());
}