dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。
先看一下需求
- 解析下面的xml文件,生成student的list(student属性有姓名、id、班级)
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<classes>
<class name="ST01">
<student id="10001">user1</student>
<student id="10002">user2</student>
<student id="10003">user3</student>
</class>
<class name="ST02">
<student id="10004">user4</student>
<student id="10005">user5</student>
<student id="10006">user6</student>
</class>
<class name="ST03">
<student id="10007">user7</student>
<student id="10008">user8</student>
<student id="10009">user9</student>
</class>
<class name="ST04">
<student id="10010">user10</student>
<student id="10011">user12</student>
<student id="10012">user13</student>
</class>
<class name="ST05">
<student id="10013">user14</student>
<student id="10014">user15</student>
<student id="10015">user16</student>
</class>
</classes>
导入dom4j需要的jar包
- 这里是maven项目把下面代码加入pom.xml
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
根据需求生成实体类
public class Student {
private String username;
private String StudentClass;
private String id;
//get和set方法省略了
}
使用dom4j注意事项
- 1.节点和节点属性的关系
- 2.几个重要的方法
- 2.2.节点的名称: node.getName()
- 2.3.节点文本内容: node.getText()
- 2.4.获取当前节点的所有属性节点 List Attribute list = node.attributes();
- 2.5.获取一个节点的父节点 node.getParent()
- 2.6.获取属性节点的值list.attribute(0).getValue());
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File("src/main/resources/students.xml"));
//获取根节点元素对象
Element node = document.getRootElement();
实现需求的完整代码
public class Test01 {
List<Student> students =new ArrayList<Student>();
@Test
public void readXMLDemo() throws Exception {
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File("src/main/resources/students.xml"));
//获取根节点元素对象
Element node = document.getRootElement();
//遍历所有的元素节点
listNodes(node);
for (Student student : students) {
System.out.println(student);
}
}
/**
* 遍历当前节点元素下面的所有(元素的)子节点
*
* @param node
*/
public void listNodes(Element node) {
System.out.println("当前节点的名称::" + node.getName());
// 获取当前节点的所有属性节点
List<Attribute> list = node.attributes();
// 遍历属性节点
for (Attribute attr : list) {
System.out.println(attr.getText() + "-----" + attr.getName()
+ "---" + attr.getValue());
if (!(node.getTextTrim().equals(""))) {
System.out.println("文本内容::::" + node.getText());
Student student =new Student();
student.setUsername(node.getText());
student.setId(attr.getValue());
student.setStudentClass(attr.getParent().getParent().attribute(0).getValue());
students.add(student);
}
}
// 当前节点下面子节点迭代器
Iterator<Element> it = node.elementIterator();
// 遍历
while (it.hasNext()) {
// 获取某个子节点对象
Element e = it.next();
// 对子节点进行遍历
listNodes(e);
}
}
注意获取xml的路径
- 上面是在做测试时有效,但带web项目中会无效,识别不到xml路径
- 需要修改如下(确保xml文件在资源目录resources下)
String path = getServletContext().getRealPath("/");
Document document = reader.read(new File(path+"/WEB-INF/classes/students.xml"));