`

dom4j学习总结(二)

阅读更多
删除节点,属性,合并两个xml

(一)移除节点及属性

/**移除节点和属性的操作
 * @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());
    }
分享到:
评论

相关推荐

    dom4j_1.6.1.jar dom4j_2.1.0.jar

    总结来说,DOM4J是一个强大的XML处理库,提供了丰富的API和功能,包括解析、操作和查询XML文档。两个不同版本的jar文件包含了源码和文档,方便开发者深入学习和自定义。了解和掌握DOM4J对于处理XML任务的Java开发...

    dom4j-2.1.3.zip

    总结来说,DOM4J 2.1.3是一个强大且易用的XML处理工具,它的API文档和源代码为开发者提供了便利的学习和开发环境。无论你是XML初学者还是资深开发者,DOM4J都能成为你处理XML任务的得力助手。通过深入学习和实践,你...

    dom4j-2.0.3.zip

    《深入解析DOM4J——基于Java的XML处理框架》 ...通过阅读DOM4J的API文档(如`dom4j-2.0.3-javadoc.jar`),结合源码学习(`dom4j-2.0.3-sources.jar`),可以深入理解其实现原理并更好地利用它来解决实际问题。

    dom4j的Java工程

    总结来说,这个“dom4j的Java工程”是一个学习和实践DOM4J的绝佳资源。通过研究其中的代码,你可以掌握DOM4J处理XML的基本技巧,并理解如何将其应用到实际的Java项目中,以实现XML文件的高效管理和操作。无论是新手...

    XML DOM4J学习笔记

    二、DOM4J基本概念 1. Document:DOM4J的核心类,表示整个XML文档,包含了根元素和其他所有元素。 2. Element:表示XML文档中的一个节点,可以有子元素、属性和文本。 3. Attribute:表示元素的属性,每个属性都有一...

    dom4j(2.1.1+ 2.0.2+ 1.6.1).zip

    学习DOM4J有助于理解XML处理的基本原理,提升XML文档操作的效率,同时在实际项目中能够更灵活地处理XML数据。无论是新手还是经验丰富的开发者,DOM4J都是值得掌握的技能之一。 **总结** DOM4J是一个高效的XML处理库...

    dom4j2

    标题 "dom4j2" 指的是DOM4J的第二个主要版本,这是一个流行的Java库,专门用于处理XML文档。DOM4J是一个灵活且功能强大的API,它提供了丰富的功能来读取、写入、修改以及操作XML文件。在这个场景中,我们可能会探讨...

    dom4j-1.6.1

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高性能的方式来解析、创建、操作和构建XML内容。在“dom4j-1.6.1”压缩包...开发者可以通过这个压缩包中的“dom4j-1.6.1.jar”文件开始学习和使用DOM4J。

    dom4j-jar与dom4j解析xml文档介绍

    **标题解析:** "dom4j-jar与dom4j解析xml文档介绍" 这个标题告诉...通过学习和使用dom4j,开发者能够高效地处理XML数据,特别是在Java环境中。提供的API文档jar包和解析XML的PDF说明,将有助于深入理解和应用这个库。

    dom4j解析xml详解,包含源代码,dom4j.jar包

    DOM4J是一个强大的Java库,专门用于处理XML文档...通过深入学习DOM4J,开发者可以更好地处理XML数据,实现各种复杂的数据操作。提供的源代码和解析XML详解文档将有助于进一步理解DOM4J的工作机制,并提升实际开发能力。

    Dom4J完成例子,Dom4J

    **Dom4j详解** ...总结来说,Dom4j是一个强大的XML处理库,它简化了XML的读写、解析、修改和查询操作,是Java开发中处理XML文档的首选工具之一。通过学习和实践这些基本用法,你可以轻松地应对各种XML处理需求。

    dom4j帮助文档和架包

    总结来说,DOM4J是一个强大且全面的XML处理工具,适用于广泛的XML应用场景,无论是解析、构建还是操作XML文档,它都能提供高效且易于使用的解决方案。通过学习“dom4j帮助文档和架包”,开发者能够掌握DOM4J的精髓,...

    DOM4J_xpath

    ### DOM4J与XPath详解 #### 一、DOM4J简介 **DOM4J**是一款由dom4j.org开发的开源XML解析库,专为Java平台设计,它不仅支持DOM和SAX这...对于想要学习DOM4J和XPath的朋友来说,本文提供了深入的理解和技术实践指南。

    dom4j api文档

    **DOM4J API文档概述** ...深入学习和掌握DOM4J API,可以极大地提高XML处理的效率和灵活性,为Java项目中的XML操作提供便利。在实际开发中,结合apidocs中的详细说明,可以更高效地利用DOM4J解决问题。

    dom4j-1.6.1.zip

    这些文档对于理解DOM4J的用法和API细节非常有帮助,开发者可以通过查阅这些文档快速学习和解决问题。 **使用DOM4J的关键概念** 1. **Element**:表示XML文档中的元素,是DOM4J中最基本的节点类型。你可以通过...

    dom4j 学习笔记

    **DOM4J学习笔记** DOM4J是一个强大的Java XML API,它提供了丰富的XML处理功能,包括文档构建、解析、修改和查询。作为一个开源项目,DOM4J在XML处理领域具有广泛的用户基础,因其简单易用和高效性能而备受青睐。...

    dom4j-2.1.0

    **DOM4J 2.1.0:XML处理与解析的高效工具...总结来说,DOM4J 2.1.0是一个强大且易用的XML处理库,通过其丰富的API和高效的性能,使得XML操作成为Java开发中的轻松任务。无论是新手还是经验丰富的开发者,都能从中受益。

    dom4j文件很好

    而"dom4j.txt"可能是DOM4J的API文档或者相关说明文本,供开发者查阅和学习。 总结来说,DOM4J是Java处理XML的强大工具,它的灵活性和易用性使其成为开发者的首选。通过深入理解和熟练应用DOM4J,开发者能够高效地...

Global site tag (gtag.js) - Google Analytics