Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件。(http://www.dom4j.org/download.html)
DOM4J主要接口都在org.dom4j这个包里定义。
-Node为所有的dom4j中XML节点定义了多态行为;
-Branch为能够包含子节点的节点如XML元素(Element)和文档(Document)定义了一个公共的行为;
|-Element 定义XML 元素;
|-Document定义了XML文档;
-DocumentType定义XML DOCTYPE声明;
-Entity定义 XML entity;
-Attribute定义了XML的属性;
-ProcessingInstruction 定义 XML 处理指令;
-CharacterData是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text;
|- CDATA 定义了XML CDATA 区域;
|-Text 定义XML 文本节点;
|- Comment 定义了XML注释的行为;
<?xml version="1.0" encoding="UTF-8"?>
<学生列表>
<学生 学号="001">
<姓名>郭靖</姓名>
<性别>男</性别>
<年龄>25</年龄>
</学生>
<学生 学号="002">
<姓名>黄蓉</姓名>
<性别>女</性别>
<年龄>20</年龄>
</学生>
</学生列表>
1)读取所有元素信息
@Test
public void testRead1() throws Exception{
//1、创建SAXReader实例
SAXReader reader = new SAXReader();
//2、通过read方法加载XML文档,并获得Document文档对象
Document doc = reader.read("src/student.xml");
//3、获得根元素
Element e = doc.getRootElement();
//4、遍历根元素下面所有子元素
praseChildElement(e);
}
//遍历指定元素下面的所有子元素
private void praseChildElement(Element e) {
System.out.println(e.getName());
//获取元素下面的所有子元素
List<Element> cList = e.elements();
for(Element c:cList){
praseChildElement(c);
}
}
2)读取指定元素内容
@Test
public void testRead2() throws Exception{
//1、创建SAXReader实例
SAXReader reader = new SAXReader();
//2、通过read方法加载XML文档,并获得Document文档对象
Document doc = reader.read("src/student.xml");
//获得第一个学生节点
Element student = (Element) doc.getRootElement().elements("学生").get(0);
//获得第一个学生节点下的姓名节点
Element name = student.element("姓名");
//获得姓名节点的内容
System.out.println(name.getText());
}
3)读取属性
@Test
public void testRead3() throws Exception{
//1、创建SAXReader实例
SAXReader reader = new SAXReader();
//2、通过read方法加载XML文档,并获得Document文档对象
Document doc = reader.read("src/student.xml");
//获得第一个学生节点
Element student = (Element) doc.getRootElement().elements("学生").get(0);
//读取第一个学生节点的学号属性
Attribute attr = student.attribute("学号");
//获得学号的名称和值
System.out.println(attr.getName()+"="+attr.getValue());
}
@Test
public void testAdd1() throws Exception{
//1、创建SAXReader实例
SAXReader reader = new SAXReader();
//2、通过read方法加载XML文档,并获得Document文档对象
Document doc = reader.read("src/student.xml");
//获得第一个学生节点
Element student = (Element) doc.getRootElement().elements("学生").get(0);
//在学生节点下添加新的元素
Element newElement = student.addElement("师傅");
//设置元素内容
newElement.setText("江南七怪");
//将内存的XML数据写入到磁盘文件中
//注意:如果文档中含有中文,需要设置写入的编码格式
OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出
format.setEncoding("utf-8");//指定XML编码
//1、创建XMLWriter对象,指定写出的文件路径
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format);
//2、调用writer方法将内存内容写出
writer.write(doc);
//3、关闭对象,释放资源
writer.close();
}
@Test
public void testUpdate1() throws Exception{
//1、创建SAXReader实例
SAXReader reader = new SAXReader();
//2、通过read方法加载XML文档,并获得Document文档对象
Document doc = reader.read("src/student.xml");
//获得第一个学生节点
Element student = (Element) doc.getRootElement().elements("学生").get(0);
Element age = student.element("年龄");
//修改元素内容
age.setText("30");
//将内存的XML数据写入到磁盘文件中
//注意:如果文档中含有中文,需要设置写入的编码格式
OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出
format.setEncoding("utf-8");//指定XML编码
//1、创建XMLWriter对象,指定写出的文件路径
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format);
//2、调用writer方法将内存内容写出
writer.write(doc);
//3、关闭对象,释放资源
writer.close();
}
@Test
public void testDelete1() throws Exception{
//1、创建SAXReader实例
SAXReader reader = new SAXReader();
//2、通过read方法加载XML文档,并获得Document文档对象
Document doc = reader.read("src/student.xml");
//获得第一个学生节点
Element student = (Element) doc.getRootElement().elements("学生").get(0);
student.detach();//删除元素
//将内存的XML数据写入到磁盘文件中
//注意:如果文档中含有中文,需要设置写入的编码格式
OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出
format.setEncoding("utf-8");//指定XML编码
//1、创建XMLWriter对象,指定写出的文件路径
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format);
//2、调用writer方法将内存内容写出
writer.write(doc);
//3、关闭对象,释放资源
writer.close();
}