Dom4j也可以很方便完成XML文档的创建、元素的修改、文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好。

准备

首先,提供相关的jar包

Dom4j jar包下载:

http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/

jaxen jar下载:

http://repo1.maven.org/maven2/jaxen/jaxen/1.1.1/jaxen-1.1.1.jar

和dom4j依赖或相关的jar:

http://dom4j.sourceforge.net/dependencies.html

Junit-jar下载:

http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.org.junit&version=4.8.1&type=binary

其次,准备测试案例的部分代码:

package com.hoo.test;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.QName;
import org.dom4j.dom.DOMAttribute;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.BaseElement;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DocumentTest {
private SAXReader reader = null;
@Before
public void init() {
reader = new SAXReader();
}
@After
public void destory() {
reader = null;
System.gc();
}
public void fail(Object o) {
if (o != null)
System.out.println(o);
}
}

  

创建一篇XML文档

文档格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<!--An XML Catalog-->
<?target instruction?>
<journal title="XML Zone" publisher="IBM developerWorks">
<article level="Intermediate" date="December-2001">
<title>Java configuration with XML Schema</title>
<author>
<firstname>Marcello</firstname>
<lastname>Vitaletti</lastname>
</author>
</article>
</journal>
</catalog>

  

@Test
public void createDocument() {
//创建一篇文档
Document doc = DocumentHelper.createDocument();
//添加一个元素
Element root = doc.addElement("catalog");
//为root元素添加注释
root.addComment("An XML Catalog"); //添加标记
root.addProcessingInstruction("target", "instruction"); //创建元素
Element journalEl = new BaseElement("journal"); //添加属性
journalEl.addAttribute("title", "XML Zone");
journalEl.addAttribute("publisher", "IBM developerWorks");
root.add(journalEl); //添加元素
Element articleEl = journalEl.addElement("article");
articleEl.addAttribute("level", "Intermediate");
articleEl.addAttribute("date", "December-2001");
Element titleEl = articleEl.addElement("title"); //设置文本内容
titleEl.setText("Java configuration with XML Schema");
//titleEl.addText("Java configuration with XML Schema");
Element authorEl = articleEl.addElement("author");
authorEl.addElement("firstname").setText("Marcello");
authorEl.addElement("lastname").addText("Vitaletti"); //可以使用 addDocType() 方法添加文档类型说明。
doc.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd");
fail(doc.getRootElement().getName()); //将xml转换成文本
fail(doc.asXML());
//写入到文件
}

  

* DocumentHelper是一个文档助手类(工具类),它可以完成文档、元素、文本、属性、注释、CDATA、Namespace、XPath的创建,以及利用XPath完成文档的遍历和将文本转换成Document;

parseText完成将xml字符串转换成Doc的功能

Document doc = DocumentHelper.parseText("<root></root>");

  createDocument创建一个文档

Document doc = DocumentHelper.createDocument();

  

如果带参数就会创建一个带有根元素的文档

createElement_x创建一个元素

Element el = DocumentHelper.createElement_x("el");

  
* Document的addElement方法可以给当前文档添加一个子元素

Element root = doc.addElement("catalog");

  * addComment方法可以添加一段注释

root.addComment("An XML Catalog");

  

为root元素添加一段注释

* addProcessingInstruction添加一个标记

root.addProcessingInstruction("target", "instruction");

  

为root元素添加一个标记

* new BaseElement可以创建一个元素

Element journalEl = new BaseElement("journal");

  * addAttribute添加属性

journalEl.addAttribute("title", "XML Zone");

  * add添加一个元素

root.add(journalEl);

  

将journalEl元素添加到root元素中

* addElement添加一个元素,并返回当前元素

Element articleEl = journalEl.addElement("article");

  

给journalEl元素添加一个子元素article

* setText、addText可以设置元素的文本

authorEl.addElement("firstname").setText("Marcello");
authorEl.addElement("lastname").addText("Vitaletti");

  * addDocType可以设置文档的DOCTYPE

doc.addDocType("catalog", null,file://c:/Dtds/catalog.dtd);

  * asXML可以将文档或元素转换成一段xml字符串

doc.asXML();
root.asXML();

  * XMLWriter类可以把文档写入到文件中

output = new XMLWriter(new FileWriter(new File("file/catalog.xml")));
output.write(doc);
output.close();

  # 修改XML文档内容

@SuppressWarnings("unchecked")
@Test
public void modifyDoc() {
try {
Document doc = reader.read(new File("file/catalog.xml"));
//修改属性内容
List list = doc.selectNodes("//article/@level");
Iterator<Attribute> iter = list.iterator();
while (iter.hasNext()) {
Attribute attr = iter.next();
fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());
if ("Intermediate".equals(attr.getValue())) {
//修改属性值
attr.setValue("Introductory");
fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());
}
} list = doc.selectNodes("//article/@date");
iter = list.iterator();
while (iter.hasNext()) {
Attribute attr = iter.next();
fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());
if ("December-2001".equals(attr.getValue())) {
//修改属性值
attr.setValue("December-2011");
fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());
}
}
//修改节点内容
list = doc.selectNodes("//article");
Iterator<Element> it = list.iterator();
while (it.hasNext()) {
Element el = it.next();
fail(el.getName() + "#" + el.getText() + "#" + el.getStringValue());
//修改title元素
Iterator<Element> elIter = el.elementIterator("title");
while(elIter.hasNext()) {
Element titleEl = elIter.next();
fail(titleEl.getName() + "#" + titleEl.getText() + "#" + titleEl.getStringValue());
if ("Java configuration with XML Schema".equals(titleEl.getTextTrim())) {
//修改元素文本值
titleEl.setText("Modify the Java configuration with XML Schema");
fail(titleEl.getName() + "#" + titleEl.getText() + "#" + titleEl.getStringValue());
}
}
}
//修改节点子元素内容
list = doc.selectNodes("//article/author");
it = list.iterator();
while (it.hasNext()) {
Element el = it.next();
fail(el.getName() + "#" + el.getText() + "#" + el.getStringValue());
List<Element> childs = el.elements();
for (Element e : childs) {
fail(e.getName() + "#" + e.getText() + "#" + e.getStringValue());
if ("Marcello".equals(e.getTextTrim())) {
e.setText("Ayesha");
} else if ("Vitaletti".equals(e.getTextTrim())) {
e.setText("Malik");
}
fail(e.getName() + "#" + e.getText() + "#" + e.getStringValue());
}
}
//写入到文件
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

  

* reader.read(new File("file/catalog.xml"));读取指定xml文件内容到文档中;

* selectNodes是XPath的查询方法,完成xml文档的查询,传递xpath路径。其使用方法可以参考jdom的xpath的使用方法:

http://www.cnblogs.com/hoojo/archive/2011/08/11/2134638.html

* getName获取元素标签名称、getValue、getText获取值、文本内容;

* elementIterator("title");获取当前节点下所有的title元素,返回Iterator;

* elements获取下面所有的子元素,返回的是一个集合List;

显示文档相关信息

private String format(int i) {
String temp = "";
while (i > 0) {
temp += "--";
i--;
}
return temp;
} private void print(int i, List<Element> els) {
i++;
for (Element el : els) {
fail(format(i) + "##" + el.getName() + "#" + el.getTextTrim());
if (el.hasContent()) {
print(i, el.elements());
}
}
} @Test
public void printInfo() {
try {
Document doc = reader.read(new File("file/catalog.xml"));
fail("asXML: " + doc.asXML());
fail(doc.asXPathResult(new BaseElement("article")));
List<Node> list = doc.content();
for (Node node : list) {
fail("Node: " + node.getName() + "#" + node.getText() + "#"
+ node.getStringValue());
}
fail("-----------------------------");
print(0, doc.getRootElement().elements());
fail("getDocType: " + doc.getDocType());
fail("getNodeTypeName: " + doc.getNodeTypeName());
fail("getPath: " + doc.getRootElement().getPath());
fail("getPath: "
+ doc.getRootElement().getPath(new BaseElement("journal")));
fail("getUniquePath: " + doc.getRootElement().getUniquePath());
fail("getXMLEncoding: " + doc.getXMLEncoding());
fail("hasContent: " + doc.hasContent());
fail("isReadOnly: " + doc.isReadOnly());
fail("nodeCount: " + doc.nodeCount());
fail("supportsParent: " + doc.supportsParent());
} catch (DocumentException e) {
e.printStackTrace();
}
fail("getEncoding: " + reader.getEncoding());
fail("isIgnoreComments: " + reader.isIgnoreComments());
fail("isMergeAdjacentText: " + reader.isMergeAdjacentText());
fail("isStringInternEnabled: " + reader.isStringInternEnabled());
fail("isStripWhitespaceText: " + reader.isStripWhitespaceText());
fail("isValidating: " + reader.isValidating());
}

  # 删除文档内容

@Test
public void removeNode() {
try {
Document doc = reader.read(new File("file/catalog-modified.xml"));
fail("comment: " + doc.selectSingleNode("//comment()"));
// 删除注释
doc.getRootElement().remove(doc.selectSingleNode("//comment()"));
Element node = (Element) doc.selectSingleNode("//article");
// 删除属性
node.remove(new DOMAttribute(QName.get("level"), "Introductory"));
// 删除元素 节点
node.remove(doc.selectSingleNode("//title"));
// 只能删除下一级节点,不能超过一级;(需要在父元素的节点上删除子元素)
Node lastNameNode = node.selectSingleNode("//lastname");
lastNameNode.getParent().remove(lastNameNode);
fail("Text: " + doc.selectObject("//*[text()='Ayesha']"));
Element firstNameEl = (Element) doc.selectObject("//firstname");
fail("Text: " + firstNameEl.selectSingleNode("text()"));
// 删除text文本
// firstNameEl.remove(firstNameEl.selectSingleNode("text()"));
// firstNameEl.remove(doc.selectSingleNode("//firstname/text()"));
firstNameEl.remove(doc
.selectSingleNode("//*[text()='Ayesha']/text()"));
// 删除子元素author
// node.remove(node.selectSingleNode("//author"));
fail(doc.asXML());
} catch (Exception e) {
e.printStackTrace();
}
}

  * 删除注释

doc.getRootElement().remove(doc.selectSingleNode("//comment()"));

  

删除root元素下面的注释

* 删除属性(可以删除非命名空间的属性)

node.remove(new DOMAttribute(QName.get("level"), "Introductory"));

  

删除node节点中的名称为level,其值为Introductory的属性

* 删除元素

node.remove(doc.selectSingleNode("//title"));

  

删除node节点下的title元素

* 删除文本

firstNameEl.remove(firstNameEl.selectSingleNode("text()"));
firstNameEl.remove(doc.selectSingleNode("//firstname/text()"));
firstNameEl.remove(doc.selectSingleNode("//*[text()='Ayesha']/text()"));

  删除firstNameEl的文本内容

Dom4J对XML的创建、修改、删除等操作的更多相关文章

  1. Linux创建修改删除用户和组

    Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...

  2. oracle11g创建修改删除表

    oracle11g创建修改删除表 我的数据库名字: ORCL         密码:123456 1.模式 2.创建表 3.表约束 4.修改表 5.删除表 1.模式 set oracle_sid=OR ...

  3. MySQL进阶11--DDL数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制

    /*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修 ...

  4. Linux基础学习-用户的创建修改删除

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...

  5. Java使用DOM4J对XML文件进行增删改查操作

    Java进行XML文件操作,代码如下: package com.founder.mrp.util; import java.io.File; import java.util.ArrayList; i ...

  6. .net操作xml文件(新增.修改,删除,读取) 转

    今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 1 一.简单介绍2 using System.Xm ...

  7. Linux 创建修改删除用户和组

    200 ? "200px" : this.width)!important;} --> 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就 ...

  8. ElasticSearch.net NEST批量创建修改删除索引完整示例

    本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...

  9. MySQL入门很简单: 4 创建 修改删除表

    1. 创建表的方法 1)创建表的语法形式 首先,选择数据库: USE 数据库名: 创建表: CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件 ...

随机推荐

  1. 20 个最棒的 jQuery Tab 插件

    jQuery Tab 常用来做网页上的选项设置界面和导航,本文向你推荐最棒的 20 个 jQuery Tab 插件.Enjoy !! 1. Slider Tabs SliderTabs 是一个可定制的 ...

  2. python的split用法

    Python中没有字符类型的说法,只有字符串,这里所说的字符就是只包含一个字符的字符串!!!这里这样写的原因只是为了方便理解,仅此而已. 1. 按照某一个分隔符分割一个字符串: >>> ...

  3. 互联网科技今年九个兴奋点:O2O深耕细作,可穿戴设备分水岭

    http://new.iheima.com/detail/2014/0204/58374.html i黑马观察到,2014年是O2O的深耕细作年,而线上和线下结合这一互联网化趋势,将会向更多产业扩散, ...

  4. 1920-Jangbi的Rush

    描述 最后一届的OSL决赛由神族的Jangbi对阵人族Fantasy.Jangbi5BG爆叉叉准备一波rush,但是范特西早有防备,在地图上埋下了许多地雷.但是Jangbi显然不是毕姥爷那样的无脑平A ...

  5. matlab numpy equivalents

    THIS IS AN EVOLVING WIKI DOCUMENT. If you find an error, or can fill in an empty box, please fix it! ...

  6. mplayer windows configure修改

    相信大家在编译mplayer的时候,都会遇到一个问题,就是那个折腾人的mplayer会检测当面目录下有没有ffmpeg的文件夹. 没有的话,mplayer会启动git进行漫长的下载ffmpeg源码.其 ...

  7. Form Personalization应用总结

    1 Form Personalization 简介 Oracle EBS 11.5.10增加了Form Personalization功能,该功能不仅是技术功能的一次增强,也是对业务功能的扩展,提高了 ...

  8. U制作LFS linux

    我希望自己的LFS运行在U盘上,远期目标是要制作一个基于LFS的编程练习U盘,方便自己的编程练习.今天算是工作的第一步,先把LFS做到U盘上. 把Linux做到U盘上通常的做法是采用两步启动法:先生成 ...

  9. C# 获取word批注信息

    今天在Silverlight 应用程序中实现了 获取word文档批注信息 的功能. 在wcf服务继承接口类中编写的函数如下 /// <summary> /// 获取word批注信息 /// ...

  10. Android ViewPager多页面滑动切换以及动画效果

    一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式,白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了, ...