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 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件 ...
随机推荐
- sjtu1591 Count On Tree
Description Crystal家有一棵树.树上有\(n\)个节点,编号由\(1\)到\(n\)(\(1\)号点是这棵树的根),两点之间距离为1当且仅当它们直接相连.每个点都有各自的权值,第\( ...
- sublime text 2 前端编码神器-快捷键与使用技巧介绍
介绍网址:http://www.xuanfengge.com/sublime-text-2-artifact.html
- POJ2222+暴力搜索
一共2^15个状态 比较简单 /* 2^15 states */ #include<stdio.h> #include<string.h> #include<stdlib ...
- centos 5.x 升级openssl
今日想在centos 5.2上面安装mysql 5.5.37,在make的时候提示: Linking C shared module adt_null.so [ 65%] Built target a ...
- Linux配置系统
配置架构: 三元素: 配置文件, 环境变量, 命令行选项 三级别: 系统级,用户级,程序级 应用: 调用时可能发生变化的配置信息,使用命令行选项:改动很少但确实应该由各个用户自己控制的配置信息,使用用 ...
- Uva 12361 File Retrieval 后缀数组+并查集
题意:有F个单词,1 <= F <=60 , 长度<=10^4, 每次可以输入一个字符串,所有包含该字串的单词会形成一个集合. 问最多能形成多少个不同的集合.集合不能为空. 分析:用 ...
- Altium自定义的快捷键设置
我想要在AD09里面设置自定义的快捷键,例如将布线设置成键盘上的字母E键,如何设置求大神指点!感激不尽!!! 为什么快捷键都要发一篇文章呢?主要是AD换层的快捷键是*号,与其他快捷键离的很远,一个AD ...
- (?m)
centos6.5:/root/sbin#cat -n vv 1 192.168.11.186,192.168.11.187 35199,3306 Dec 7, 2016 11:40:02.75052 ...
- 【原创】FPGA开发手记(三) PS/2键盘
以下内容均以Xilinx的Nexys3作为开发板 1.PS/2键盘简介 虽然Nexys3开发板是利用USB接口搭载键盘,但是其原理与PS/2键盘完全相同,现在就仅以PS/2键盘为例讲解如何将键盘搭 ...
- Android开发之启动Activity的最佳写法
从MainActivity跳转到SecondActivity 在SecondActivity中,写一个静态方法actionStart() public static void actionStart( ...