目录

​1 使用dom4j创建xml文档​

​2 使用dom4j解析xml文件​

​2.1 构建dom4j树​

​2.2 获取节点​

​2.3 获取属性​

​2.4 使用XPath获取节点和属性​

​3 使用dom4j修改xml文件​

​4 字符串转化​


1 使用dom4j创建xml文档

  Document document = DocumentHelper.createDocument();

  通过这句定义一个XML文档对象。

  Element root = document.addElement("根节点名称");

  通过这句定义一个XML元素,这里添加的是根节点。

  Element有几个重要的方法:

    addComment : 添加注释

    addAttribute : 添加属性

    addElement : 添加子元素

  最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类格式化输出,默认采用createCompactFormat()显示比较紧凑,最好使用createPrettyPrint()。

实例代码

package cn.mars.app.txn.whpf;

import java.io.FileOutputStream;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Dom4jTest {

public static void main(String[] args) {
// 创建文档。
Document document = DocumentHelper.createDocument();
// 设置文档DocType,这里为了举例,添加hibernate的DocType
document.addDocType("hibernate-configuration", "-//Hibernate/Hibernate Configuration DTD 3.0//EN",
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
// 文档增加节点,即根节点,一个文档只能有一个根节点,多加出错
Element root = document.addElement("skills");
// 添加注释
root.addComment("第一个技能");
// 根节点下添加节点
Element first = root.addElement("skill");
// 节点添加属性
first.addAttribute("name", "独孤九剑");
// 节点下添加节点
Element info = first.addElement("info");
// 节点设置内容数据
info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");

// 同理增加其他节点,内容,属性等
Element second = root.addElement("skill");
second.addAttribute("name", "葵花宝典");
Element info2 = second.addElement("info");
info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");

// 创建节点
Element third = DocumentHelper.createElement("skill");
// 将节点加入到根节点中
root.add(third);
// 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者
Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");
// 将属性加入到节点上
third.add(name);
// 创建子节点并加入到节点中
Element info3 = DocumentHelper.createElement("info");
info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");
third.add(info3);

try {
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");
// 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
FileOutputStream fos = new FileOutputStream("d:/skills.xml");
// 创建xml输出流
XMLWriter writer = new XMLWriter(fos, format);
// 生成xml文件
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

输出文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<skills>
<!--第一个技能-->
<skill name="独孤九剑">
<info>为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info>
</skill>
<skill name="葵花宝典">
<info>宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。</info>
</skill>
<skill name="北冥神功">
<info>逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。</info>
</skill>
</skills>

2 使用dom4j解析xml文件

2.1 构建dom4j树

  org.dom4j.io提供了两个类:SAXReader和DOMReader,DOMReader只能一个现有的w3c DOM树构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document树,而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。

  实例代码:使用SAXReader解析

SAXReader reader = new SAXReader();
Document document = reader.read(new File("d:/skills.xml"));

  实例代码:使用DOMReader解析

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
File file = new File("d:/skills.xml");
org.w3c.dom.Document domDocument = db.parse(file);
DOMReader reader = new DOMReader();
org.dom4j.Document document = reader.read(domDocument);

2.2 获取节点

  获得dom4j树之后,可以根据dom4j树获取节点。首先获取根节点,然后根据根节点获取其子节点。

  实例代码:访问根节点

Element root = document.getRootElement();

  实例代码:访问所有子节点

List skills = root.elements();
for (Iterator<?> it = skills.iterator(); it.hasNext();) {
Element e = (Element) it.next();

}

  实例代码:访问指定名称的节点,如访问名称为“skill”的全部节点

List skills = root.elements("skill");
for (Iterator<?> it = skills.iterator(); it.hasNext();) {
Element e = (Element) it.next();
//TODO
}

  实例代码:访问指定名称的第一个节点

Element skill = root.element("skill");

  实例代码:迭代某个元素的所有子元素,如迭代root

for(Iterator<Element> it = root.elementIterator();it.hasNext();){
Element e = it.next();
//TODO
}

2.3 获取属性

  获取节点后,可以根据节点获取属性,获得方式与获取节点类似。

  实例代码:获取指定名称的元素

Element skill = root.element("skill");
Attribute attr1 = skill.attribute("name");

  实例代码:按照属性顺序获取属性

Element skill = root.element("skill");
Attribute attr2 = skill.attribute(0);

  实例代码:获取某节点下全部属性1

Element skill = root.element("skill");
List<Attribute> list = skill.attributes();
for (Iterator<Attribute> it = list.iterator(); it.hasNext();) {
Attribute attr = it.next();
// TODO
}

  实例代码:获取某节点下全部属性2

Element skill = root.element("skill");
for (Iterator<Attribute> it = skill.attributeIterator(); it.hasNext();) {
Attribute attr = it.next();
// TODO
}


2.4 使用XPath获取节点和属性

  Dom4j 中集成了对XPath的支持。在选择节点时,可以直接使用XPath 表达式。这种方式更加方便,简洁,官方文档中推荐使用该种方式。

  实例代码:要选择所有的<skill>元素的name属性

List list = document.selectNodes("//skills/skill/@name");
for (Iterator it = list.iterator(); it.hasNext();) {
Attribute attr = (Attribute) it.next();
//TODO
}

  注意:为了能够编译执行上述使用XPath表达式的代码,需要配置dom4j 安装包中自带的jaxen包,你也可以从http://sourceforge.net/products/jaxen/上下载jaxen。jaxen是 一个用java开发的XPath引擎,用于配合各种基于XML的对象模型,如DOM,dom4j和JDOM。在dom4-1.6.1 目录下,有一个lib 子目录,其中有个jaxen-1.1-beta-6.jar文件,需要在classpath环境变量中配置该文件的全路径名。

3 使用dom4j修改xml文件

  修改xml文件,需要先获取dom4j树(即Document),通常欲修改节点需要先获得该节点或其父节点,欲修改属性,需要先获得该属性所在的节点和该属性。

  增加操作:参照前文。

  删除操作:

  实例代码:删除某节点

Element root = document.getRootElement();
Element skill = root.element("skill");
root.remove(skill);

  实例代码:删除指定名称的属性

Element skill = root.element("skill");
skill.remove(skill.attribute("name"));

  修改操作:

  实例代码:修改节点名称和节点值

Element skill = root.element("skill");
skill.setName("new_skill");
skill.setText("你好");

  实例代码:修改属性值

Attribute attr = skill.attribute("name");
attr.setText("newName");

  属性名称无法修改,欲修改属性名称,可以先删除旧属性,再增加新属性

4 字符串转化

  实例代码:把节点,属性,文档等转化成字符串,使用asXML()方法。

String docXmlText = document.asXML();
String rootXmlText = root.asXML();

  实例代码:把字符串转换为文档,注意引号需要转义

String skillString = "<skill name="xxx">神龙摆尾</skill>";
Document d = DocumentHelper.parseText(skillString);