使用dom4j使用为什么删不掉?

Dom4J对XML的创建、修改、删除等操作
Dom4j也可以很方便完成XML文档的创建、元素的修改、文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好。
首先,提供相关的jar包
Dom4j jar包下载:
jaxen jar下载:
和dom4j依赖或相关的jar:
Junit-jar下载:
其次,准备测试案例的部分代码:
package com.hoo.
import java.io.F
import java.util.I
import java.util.L
import org.dom4j.A
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.DocumentH
import org.dom4j.E
import org.dom4j.N
import org.dom4j.QN
import org.dom4j.dom.DOMA
import org.dom4j.io.SAXR
import org.dom4j.tree.BaseE
import org.junit.A
import org.junit.B
import org.junit.T
public class DocumentTest {
private SAXReader reader =
public void init() {
reader = new SAXReader();
public void destory() {
System.gc();
public void fail(Object o) {
if (o != null)
System.out.println(o);
# 创建一篇XML文档
文档格式如下:
&?xml version="1.0" encoding="UTF-8"?&
&!--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&
&firstname&Marcello&/firstname&
&lastname&Vitaletti&/lastname&
&/article&
&/journal&
&/catalog&
创建文档代码如下:
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")
public void modifyDoc() {
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的使用方法:
* getName获取元素标签名称、getValue、getText获取值、文本内容;
* elementIterator("title");获取当前节点下所有的title元素,返回Iterator;
* elements获取下面所有的子元素,返回的是一个集合List;
# 显示文档相关信息
private String format(int i) {
String temp = "";
while (i & 0) {
temp += "--";
private void print(int i, List&Element& els) {
for (Element el : els) {
fail(format(i) + "##" + el.getName() + "#" + el.getTextTrim());
if (el.hasContent()) {
print(i, el.elements());
public void printInfo() {
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());
# 删除文档内容
public void removeNode() {
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的文本内容
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。本帖子已过去太久远了,不再提供回复功能。【工程截图】
【person.xml】准备一个xml文件
&?xml version="1.0" encoding="UTF-8"?&
&students&
&student id="88888" phone="" sex="男"&
&name&张三&/name&
&age&18&/age&
&school&清华&/school&
&/student&
&student id="99999" phone="" sex="女"&
&name&李四&/name&
&age&28&/age&
&school&北大&/school&
&/student&
&aa1&aa111&/aa1&
&aa2&aa222&/aa2&
&BBBB&&/BBBB&
&/students&
【读取原有Xml文件的内容,然后将数据写入到磁盘上】
package com.Higgin.dom4j;
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.io.SAXR
import org.dom4j.io.XMLW
读出原有xml文件的内容数据,然后将数据写入到磁盘上的XML文件
public class WriteDemo01 {
public static void main(String[] args) throws DocumentException, IOException {
//读取已存在的Xml文件person.xml
Document doc=new SAXReader().read(new File("./src/person.xml"));
//指定文件输出的位置
FileOutputStream out =new FileOutputStream("d:/student.xml");
//1.创建写出对象
XMLWriter writer=new XMLWriter(out);
//2.写出Document对象
writer.write(doc);
//3.关闭流
writer.close();
【运行结果】内容和person.xml一致
【按照设定的格式将xml内容输出保存到对应的磁盘地址上】
package com.Higgin.dom4j;
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.io.OutputF
import org.dom4j.io.SAXR
import org.dom4j.io.XMLW
1.读出原有xml文件的内容数据,保存至Document对象
2.修改输出的format(输出格式、编码...)
3.然后将document包含数据写入到磁盘上的XML文件
public class WriteDemo02 {
public static void main(String[] args) throws DocumentException, IOException {
//读取已存在的Xml文件person.xml
Document doc=new SAXReader().read(new File("./src/person.xml"));
//指定文件输出的位置
FileOutputStream out =new FileOutputStream("d:/student.xml");
指定文本的写出的格式:
紧凑格式 :项目上线时候使用
漂亮格式:开发调试的时候使用
//OutputFormat format=OutputFormat.createCompactFormat();
//紧凑格式:去除空格换行
OutputFormat format=OutputFormat.createPrettyPrint();
//漂亮格式:有空格换行
* 指定生成的xml文档的编码影响了:
1.xml文档保存时的编码
2.xml文档声明的encoding编码(Xml解析时的编码)
* 结论:使用该方法生成Xml文档可以避免中文乱码问题
format.setEncoding("UTF-8");
//1.创建写出对象
XMLWriter writer=new XMLWriter(out,format);
//2.写出Document对象
writer.write(doc);
//3.关闭流
writer.close();
【运行结果】
同样在D盘下生成了一个student.xml文件
&1.紧凑格式:
2.漂亮格式
* 指定生成的xml文档的编码影响了:
1.xml文档保存时的编码
2.xml文档声明的encoding编码(Xml解析时的编码)
* 结论:使用该方法生成Xml文档可以避免中文乱码问题
【增、删、改 Xml文件
1.创建Document对象, *
添加:各种标签、属性、文本 *
修改:属性值、文本 *
删除:标签、属性 *
2.修改输出的format(输出格式、编码...) *
3.然后将document包含数据写入到磁盘上的XML文件 */
【增加:文档、标签、属性】
* 增加:文档、标签、属性
public void testAdd() throws DocumentException, IOException {
//1.创建文档
Document doc=DocumentHelper.createDocument();
//2.添加标签
Element rootElem=doc.addElement("root");
Element stuElem=rootElem.addElement("student");
stuElem.addElement("name");
//4.增加属性
stuElem.addAttribute("id", "88888");
stuElem.addAttribute("sex", "男");
//指定文件输出的位置
FileOutputStream out =new FileOutputStream("d:/student.xml");
// 指定文本的写出的格式:
OutputFormat format=OutputFormat.createPrettyPrint();
//漂亮格式:有空格换行
format.setEncoding("UTF-8");
//1.创建写出对象
XMLWriter writer=new XMLWriter(out,format);
//2.写出Document对象
writer.write(doc);
//3.关闭流
writer.close();
【运行结果】
【修改:属性值、文本】
* 修改:属性值、文本
public void testUpdate() throws DocumentException, IOException{
//创建Document对象,读取已存在的Xml文件person.xml
Document doc=new SAXReader().read(new File("./src/person.xml"));
* 修改属性值(方案一)
* 方法:使用Attribute类(属性类)的setValue()方法
* 1.得到标签对象
* 2.得到属性对象
* 3.修改属性值
//1.1 得到标签对象
Element stuElem=doc.getRootElement().element("student");
//1.2 得到id属性对象
Attribute idAttr=stuElem.attribute("id");
//1.3 修改属性值
idAttr.setValue("000001");
修改属性值(方案二)
方法:Element标签类的addAttribute("attr","value")方法
//1.得到属性值标签
Element stuElem=doc.getRootElement().element("student");
//2.通过增加同名属性的方法,修改属性值
stuElem.addAttribute("id", "000009");
//key相同,覆盖;不存在key,则添加
* 修改文本
* 方法:Element标签类的setTest("新文本值")方法
* 1.得到标签对象
* 2.修改文本
Element nameElem=doc.getRootElement().element("student").element("name");
nameElem.setText("王二麻子");
//指定文件输出的位置
FileOutputStream out =new FileOutputStream("d:/student.xml");
// 指定文本的写出的格式:
OutputFormat format=OutputFormat.createPrettyPrint();
//漂亮格式:有空格换行
format.setEncoding("UTF-8");
//1.创建写出对象
XMLWriter writer=new XMLWriter(out,format);
//2.写出Document对象
writer.write(doc);
//3.关闭流
writer.close();
【删除:标签、属性】
* 删除:标签、属性
public void testDelete() throws DocumentException, IOException{
//创建Document对象,读取已存在的Xml文件person.xml
Document doc=new SAXReader().read(new File("./src/person.xml"));
* 删除标签
* 1.得到标签对象
* 2.删除标签对象(可以通过父类删除子标签,也可以自己删自己)
Element ageElement=doc.getRootElement().element("student").element("age");
ageElement.detach();
//直接detch()删除
//ageElement.getParent().remove(ageElement); //先获取父标签,然后remove()删除子标签
* 删除属性
//1.得到标签对象
//等同于Element stuElem=doc.getRootElement().element("student");
Element stuElem=(Element) doc.getRootElement().elements().get(0);
//2.得到属性对象
Attribute idAttr=stuElem.attribute("id");
//3.删除属性
idAttr.detach();
//指定文件输出的位置
FileOutputStream out =new FileOutputStream("d:/student.xml");
// 指定文本的写出的格式:
OutputFormat format=OutputFormat.createPrettyPrint();
//漂亮格式:有空格换行
format.setEncoding("UTF-8");
//1.创建写出对象
XMLWriter writer=new XMLWriter(out,format);
//2.写出Document对象
writer.write(doc);
//3.关闭流
writer.close();
阅读(...) 评论()1999人阅读
● 编程语言(82)
------【XML】(1)
前言:首先谈一个小故事:当年Java准备做对XML的解析时,对解析器的实现方向在内部发生了争执,后来高层没有听从工程师建议,坚持开发出了JDOM,而主要的工程师选择离开Java 按照自己的方式实现,就是DOM4J 。后来结果表明,DOM4J 完胜了JDOM。下面,让我们来了解一下通过DOM4J 实现对XML文件进行增删改查的过程。
1、待解析的XML文件:
&span style=&font-size:14&&
&?xml version=&1.0& encoding=&utf-8&?&
&students xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns=&/xml&
xsi:schemaLocation=&/xml students.xsd&&
&student number=&ITCAST_1001&&
&name&zhangSan&/name&
&age&23&/age&
&sex&male&/sex&
&/student&
&/students&
2、用DOM4J实现增删改查:
&span style=&font-size:14&&
public class Demo3 {
public void method1() throws Exception {
// 创建解析器
SAXReader reader = new SAXReader();//这个是用来读取文件内容的
Document doc = reader.read(new File(&students.xml&)); //指定要读取的文件
//System.out.println(doc.asXML()); //打印出文件
//实现对XML文件的复制
public void method2() throws Exception {
// 得到Document
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(&students.xml&));
// 保存Document,指定将写入的目的文件(复制功能)
XMLWriter writer = new XMLWriter(new FileOutputStream(&students_copy.xml&));
writer.write(doc); //开始写入
//遍历Document
public void method3() throws Exception {
// 要遍历文档,首先要得到Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(&students.xml&));
//获取根元素
Element root = doc.getRootElement();
//获取根元素中所有student元素
List&Element& stuEleList = root.elements(&student&);
// 循环遍历所有学生元素
for(Element stuEle : stuEleList) {
//获取学生元素的number
String number = stuEle.attributeValue(&number&);
//获取学生元素名为name的子元素的文本内容
String name = stuEle.elementText(&name&);
//获取学生元素名为age的子元素的文本内容
String age = stuEle.elementText(&age&);
//获取学生元素名为sex的子元素的文本内容
String sex = stuEle.elementText(&sex&);
System.out.println(number + &, & + name + &, & + age + &, & + sex);
//添加元素
public void method4() throws Exception {
// 得到Document
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(&src/students.xml&));
//获取root元素
Element root = doc.getRootElement();
Element stuEle = root.addElement(&student&); //添加了student元素
// 给stuEle添加属性,名为number,值为1003
stuEle.addAttribute(&number&, &1003&);
// 分别为stuEle添加名为name、age、sex的子元素,并为子元素设置文本内容
stuEle.addElement(&name&).setText(&wangWu&);
stuEle.addElement(&age&).setText(&18&);
stuEle.addElement(&sex&).setText(&male&);
// 设置保存的格式化器
1. \t,使用什么来完成缩进 2. true, 是否要添加换行
OutputFormat format = new OutputFormat(&\t&, true);
format.setTrimText(true); //去掉空白
// 在创建Writer时,指定格式化器
XMLWriter writer = new XMLWriter(new FileOutputStream(&src/students_copy.xml&), format);
writer.write(doc);
//修改元素
public void method5() throws Exception {
// 得到Document
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(&src/students_copy.xml&));
//使用XPath找到符合条件的元素
// 查询student元素,条件是number属性的值为1003
Element stuEle = (Element) doc.selectSingleNode(&//student[@number='ITCAST_1003']&);
//修改stuEle的age子元素内容为81
stuEle.element(&age&).setText(&81&);
//修改stuEle的sex子元素的内容为female
stuEle.element(&sex&).setText(&female&);
//删除元素
public void method6() throws Exception {
// 得到Document
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(&src/students_copy.xml&));
// 查找student元素,条件是name子元素的文本内容为wangWu
Element stuEle = (Element) doc.selectSingleNode(&//student[name='wangWu']&);
// 2. 获取父元素,使用父元素删除指定子元素
stuEle.getParent().remove(stuEle);
 &/span&  小结:DOM4J无论在那个方面都是非常出色的。如今越来越多的Java软件在使用DOM4J来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了DOM4J。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:204090次
积分:7092
积分:7092
排名:第3533名
原创:166篇
评论:1141条
文章:13篇
阅读:48871
阅读:6392
文章:32篇
阅读:36088
阅读:7657
阅读:9667
阅读:13533
文章:12篇
阅读:14984
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 dom4j使用 的文章

 

随机推荐