Dom4J对XML的创建、修改、删除等操作
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下载:
其次,准备测试案例的部分代码:
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的创建、修改、删除等操作的更多相关文章
- Linux创建修改删除用户和组
Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...
- oracle11g创建修改删除表
oracle11g创建修改删除表 我的数据库名字: ORCL 密码:123456 1.模式 2.创建表 3.表约束 4.修改表 5.删除表 1.模式 set oracle_sid=OR ...
- MySQL进阶11--DDL数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制
/*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修 ...
- Linux基础学习-用户的创建修改删除
用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...
- Java使用DOM4J对XML文件进行增删改查操作
Java进行XML文件操作,代码如下: package com.founder.mrp.util; import java.io.File; import java.util.ArrayList; i ...
- .net操作xml文件(新增.修改,删除,读取) 转
今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 1 一.简单介绍2 using System.Xm ...
- Linux 创建修改删除用户和组
200 ? "200px" : this.width)!important;} --> 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就 ...
- ElasticSearch.net NEST批量创建修改删除索引完整示例
本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...
- MySQL入门很简单: 4 创建 修改删除表
1. 创建表的方法 1)创建表的语法形式 首先,选择数据库: USE 数据库名: 创建表: CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件 ...
随机推荐
- Codeforces Round #211 (Div. 2)
难得一次比赛能够自己成功A掉四个题: A题:水题,模拟一下就行: #include <iostream> #include <cstdio> using namespace s ...
- Ubuntu下将Sublime Text设置为默认编辑器
转自将Sublime Text 2设置为默认编辑器 修改defaults.list 编辑/etc/gnome/default.list文件,将其中的所有gedit.desktop替换为sublime_ ...
- MySQL函数讲解(MySQL函数大全)
讲mysql函数之前先给大家展示一下利用mysql函数的一个例子: SELECT i.item_id, i.item_name, i.cid, i.last_update_time, u.url, u ...
- SQLite入门与分析(八)---存储模型(3)
写在前面:接上一节,本节主要讨论索引页面格式,以及索引与查询优化的关系. (1)索引页面格式sqlite> select * from sqlite_master;table|episodes| ...
- Android java.lang.ClassCastException
lassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这种 ...
- Android ServiceConnection
绑定到一个Service 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交 ...
- java代码转换为c# 工具
Demo Java to C# Converter.exe 已下载到 F:\SoftWare-new\java\Java_to_CSharp_Converter.rar
- 【HDOJ】1258 Sum It Up
典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过. #in ...
- 同一客户代码下一个CPN对应多个FG会出现CPN描述一样的问题
Q&A : D2E01客户下已经存在CPN: TP1062/A 对应FG: P5M2812512AFHHF0 直接在客户代码下无法新建,只能在交叉信息新建CPN: TP1062/A, 但无法修 ...
- Form - CHECKBOX全选功能
FORM BUILDER开发,遇到这样一个需求: 添加一个CHECKBOX完成全选功能,红框为新添加的CHECKBOX(如图示) Try to use APP_RECORD.FOR_ALL_RECOR ...