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 ...
随机推荐
- FFmpeg多媒体文件格式探测
FFmpeg版本:3.4 在FFmpeg中,每一种文件容器格式都对应一种AVInputFormat 结构,位于源码中libavformat文件夹中.当调用avformat_open_input的时候, ...
- VS2013 查看程序各个函数的CPU利用率<转>
自己写的程序CPU占用率过高,无法锁定原因时,可以用VS2013帮忙检测 1. 打开VS 性能分析 2. 启动项目进行检测 3. 选择CPU采样 完成 4. 分析一段时间 然后停止分析 5. 选择显示 ...
- Open MSDN document directly without Visual Studio
"C:\Program Files (x86)\Microsoft Help Viewer\v2.2\HlpViewer.exe" /catalogName VisualStudi ...
- pyinstaller 打包
[root@mhc nsf]# pip install pyinstallerCollecting pyinstaller Downloading PyInstaller-3.3.tar.gz (3 ...
- launcher启动应用重启的BUG解决
最近遇到了一个问题,从launcher重新进入已经运行的应用会直接跳到应用的第一个界面. 经过对应用的跟踪,结合网络上的资料 http://stackoverflow.com/questions/19 ...
- git远程代码库回滚(webstorm下)
git远程代码库回滚(webstorm下) 1. 场景 添加了一个文件[file-for-test.js]到git的控制下 进行了三次修改,并分别进行了三次commit,最后进行了一次push git ...
- 机器学习模型数据结构:logistic regression, neural network, convolutional neural network
可以用两种方式来看神经网络,一种就是层的集合,也就是层组成的数组,另一种是神经元的集合,也就是神经元组成的Graph. 基于神经元的实现方式中,需要定义两个类 Neuron, Weight Neuro ...
- www请求用到的Unescape
//发送请求 WWW w = new WWW(url); //web服务器返回 yield return w; if (!string.IsNullO ...
- git 忽略文件.gitignore
# 此为注释– 将被Git 忽略 *.a # 忽略所有.a 结尾的文件 !lib.a # 但lib.a 除外 /TODO # 仅仅忽略项目根目录下的TODO 文件,不包括subdir/TODO bui ...
- Maven01 环境准备、maven项目结构、编译/测试/打包/清除、安装、
0 前提准备 0.1 安装java开发环境 0.2 安装maven工具 1 maven项目基本结构 如图所示,整个maven项目有业务文件.测试文件.POM依赖管理文件:其实还有一个资源文件resou ...