documeant 学习总结(二)
(一)移除节点及属性
/**移除节点和属性的操作
* @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
Elementif the node is an immediate child of this branch. If the given node is not an immediate child of this branch then theNode.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());
}documeant 学习总结(二)的更多相关文章
- crawler4j 学习(二)
crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...
- 从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
- AspectJ基础学习之二搭建环境(转载)
AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
- UML学习(二)-----类图
UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...
随机推荐
- 怎样获取datagrid中编辑列combobox的value值与text值
var ed = $('#dg').datagrid('getEditor', {index:editIndex,field:'productid'}); var productname = $(ed ...
- VS2008调用VS2012的WCF服务的方式和遇到的问题
1 用添加服务引用的懒方式 2 用http请求方式 3 客户端自己定义一个Contract,跟服务端的一样(可以只写要使用的方法,不用全部写完). 由于规范要求,前两种都不能用,后面根据同事的描述,产 ...
- Lucene的查询及高级内容
Lucene查询 基本查询: @Test public void baseQuery() throws Exception { //1. 创建查询的核心对象 FSDirectory d = FSDir ...
- LSP(分层服务提供程序)
一.简介 LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为"分层服务提供商"的机制进行扩展.Winsock LSP 可用于非常广 ...
- Windows Server 2012 R2 Standard x64 deploy Visual Studio 2015 Application
When I run the Server application on Windows Server 2012 R2 operation system. I meet the error:MSVCP ...
- code1039 数的划分
来自http://blog.csdn.net/WhiStLenA/article/details/51585992 重点内容 设F(i,j)为用j个数组成i,答案为F(7,3)的话. 一个思路是,对于 ...
- LWIP协议栈2-
->->->
- zigbee初探
什么是zigbee? 1.它是一种通信方式,一种通信协议: 2.其作用就是构建一个类似无线局域网的东西:如果这个局域网用于传感器的数据收集.监控,那么这个网络就叫做无线传感器网络. 应用领域:家居.工 ...
- sql insert、update、delete完以后返回主键ID
以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查 ...
- win10 64位 python3.6 django1.11 MysqlDB No module named 'MySQLdb' 安装MysqlDB报错 Microsoft Visual C++ 14.0 is required
在python3.6中操作数据库,再按python2.7安装MySQLdb进行数据库连接已经不可用了,我使用的是另外一个方法:PyMySQL,安装好之后还是不能直接连接MySQL的,启动项目后报No ...