【案例】dom4j读取XML文档内容


本文将基于Java语言、使用dom4j实现XML文档内容读取,过程中将会对相关知识点进行简单说明


案例描述

使用dom4j读取XML文档中的学生信息列表,然后将学生信息放到自定义的学生实体集合中。

关于dom4j

dom4j是一个Java的XML API、是jdom的升级品,用来读写XML文档。它应用于Java平台,采用Java集合框架并完全支持DOM、SAX和JAXP。

 

1、引入dom4j的依赖

1
2
3
4
5
<dependency>
  <groupId>dom4j</groupId>
  <artifactId>dom4j</artifactId>
  <version>1.6.1</version>
</dependency>

2、在resources中创建XML文件

在Java工程中src/mian/resources路径下创建student.xml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<students>
  <student id="S1">
    <name>书法</name>
    <gender></gender>
    <age>15</age>
  </student>
  <student id="S2">
    <name>安飞</name>
    <gender></gender>
    <age>14</age>
  </student>
  <student id="S3">
    <name>李芳</name>
    <gender></gender>
    <age>15</age>
  </student>
</students>

3、编写XML内容信息对应的POJO

定义类名为Student的POJO类,包含四个属性(id、name、gender、age)及相应的getter、setter方法,重写toString函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class Student {
 
  private String id;
 
  private String name;
 
  private String gender;
 
  private int age;
 
  public String getId() {
    return id;
  }
 
  public void setId(String id) {
    this.id = id;
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public String getGender() {
    return gender;
  }
 
  public void setGender(String gender) {
    this.gender = gender;
  }
 
  public int getAge() {
    return age;
  }
 
  public void setAge(int age) {
    this.age = age;
  }
 
  @Override
  public String toString() {
    return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
  }
 
}

4、读取xml文件内容

使用dom4j很容易就可以读取到XML文档的内容

1、创建SAXReader

(import org.dom4j.io.SAXReader)

1
SAXReader reader = new SAXReader();

2、使用SAXReader读取XML文档并生成一个Document对象,该对象即XML文档内容

(importorg.dom4j.Document)

1
Document doc = reader.read("src/main/resources/student.xml");

请注意文档路径是否正确,还可以使用java.net.URL或者java.io.File等对象读取文件:

1
2
Document doc = reader.read(new File("src/main/resources/student.xml"));
Document doc = reader.read(url);

3、通过Document的getRootElement()方法读取到XML文档根元素,即<students>,然后依据根元素逐层获取XML文档信息

(import org.dom4j.Element)

1
2
3
4
Element root = doc.getRootElement();
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
  Element element = it.next();
}

5、完整代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import java.util.ArrayList;
import java.util.List;
 
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
import com.xml.model.Student;
 
/**
 * SAXReader读取XML文档
 */
public class ParseStudent {
 
  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
    try {
      /**
       * 1、创建SAXReader
       */
      SAXReader reader = new SAXReader();
      /**
       * 2、使用SAXReader读取数据源(xml文档信息) 并生成一个Document对象,该对象即表示xml文档内容
       */
      Document doc = reader.read("src/main/resources/student.xml");
      /**
       * 3、通过Document对象获取根元素
       * 
       * Document提供了方法: Element getRootElement() 用来获取XML文档中的根元素
       *
       * Element类 每一个Element实例都可以表示XML文档中的 一个元素,即:一对标签
       * 
       * Element.getName()可以获取当前元素的名字(标签名)
       */
      Element root = doc.getRootElement();
      /**
       * 4、根据XML文档结构从根元素开始逐层获取子元素最终以达到遍历XML文档内容的目的
       *
       * Element.element(String name) 获取当前元素下指定名字的子元素
       *
       * Element.elements()获取当前元素下所有子元素, 返回Element
       *
       * Element.elements(String name)获取当前元素下所有同名子元素, 返回Element
       *
       */
      List<Element> elements = new ArrayList<>();
      if (root != null && root.hasContent()) {
        elements = root.elements();
      }
      if (elements != null && !elements.isEmpty()) {
        List<Student> stus = new ArrayList<>();
        parseData(stus, elements);
        for (Student stu : stus) {
          System.out.println(stu.toString());
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  public static void parseData(List<Student> students, List<Element> elements) {
    for (Element ele : elements) {
      Student student = new Student();
      if (ele.element("name").hasContent() && ele.element("name").isTextOnly()) {
        student.setName(ele.element("name").getText());
      }
      if (ele.element("age").hasContent() && ele.element("age").isTextOnly()) {
        student.setAge(Integer.parseInt(ele.elementText("age")));
      }
      if (ele.element("gender").hasContent() && ele.element("gender").isTextOnly()) {
        student.setGender(ele.elementText("gender"));
      }
      /*
       * Element.attribute(String name)获取当前元素(标签)中指定名字的属性, 返回Attribute
       *
       * Attribute.getName()获取属性名, Attribute.getValue()获取属性值
       */
      Attribute attr = ele.attribute("id");
      if (attr.getValue() != null) {
        student.setId(attr.getValue());
      }
      students.add(student);
    }
  }
 
}

运行结果:

【案例】dom4j读取XML文档内容

— END —

【案例】dom4j读取XML文档内容

原文始发于微信公众号(程序员阿木):【案例】dom4j读取XML文档内容