A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Dom4j解析
前言

XML是可扩展标记语言的缩写,在编程领域是非常常用的,我们经常会用它进行数据的传输或者用作配置文件,那么对XML的操作的也会是我们需要掌握的一项技术,本文会使用Java语言,利用DOM4J这个非常优秀的开源库,探讨生成XML格式数据和解析XML数据的两个方面的问题。
1. Dom4J简介
  • 在Dom4j.org上,是这么介绍的:Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
  • 简单来说,Dom4j具有性能优秀,操作简单的优点

2. Dom4j的使用
  • 2.1 导入jar包

  • 2.2 案例一:用Java代码生成xml文档

    • 代码思路:我们要生成一个XML文档,其实就像我们平时书写文档是一样的道理:

      • 创建文档 -> 创建根元素 -> 添加根元素
      • 子元素也是先创建再添加到其他元素中
      • 如果元素上有属性则先添加属性

    • 下面直接上代码
    • [Java] 纯文本查看 复制代码
      ?
      01
      02
      03
      04
      05
      06
      07
      08
      09
      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
      import java.io.FileOutputStream;
      import java.io.FileWriter;

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

      public class Dom4JTest1 {

          public static void main(String[] args) throws Exception {
              // 第一种方式:创建文档,并创建根元素
              // 创建文档:使用了一个Helper类
              Document document = DocumentHelper.createDocument();

              // 创建根节点并添加进文档
              Element root = DocumentHelper.createElement("student");
              document.setRootElement(root);

              // 第二种方式:创建文档并设置文档的根元素节点
              Element root2 = DocumentHelper.createElement("student");
              Document document2 = DocumentHelper.createDocument(root2);

              // 添加属性
              root2.addAttribute("name", "zhangsan");
              // 添加子节点:add之后就返回这个元素
              Element helloElement = root2.addElement("hello");
              Element worldElement = root2.addElement("world");

              helloElement.setText("hello Text");
              worldElement.setText("world text");

              // 输出
              // 输出到控制台
              XMLWriter xmlWriter = new XMLWriter();
              xmlWriter.write(document);

              // 输出到文件
              // 格式
              OutputFormat format = new OutputFormat("    ", true);// 设置缩进为4个空格,并且另起一行为true
              XMLWriter xmlWriter2 = new XMLWriter(
                      new FileOutputStream("student.xml"), format);
              xmlWriter2.write(document2);

              // 另一种输出方式,记得要调用flush()方法,否则输出的文件中显示空白
              XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("student2.xml"),
                      format);
              xmlWriter3.write(document2);
              xmlWriter3.flush();
              // close()方法也可以

          }
      }

    • 程序Console输出:
    • [XML] 纯文本查看 复制代码
      ?
      01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      <?xml version="1.0" encoding="UTF-8"?>
      <student/>
        生成的一个xml文档:

      <?xml version="1.0" encoding="UTF-8"?>

      <student name="zhangsan">
          <hello>hello Text</hello>
          <world>world text</world>
      </student>

    • 小总结到目前为止我们已经完成了对一个xml格式数据的生成,如果要生成其他样式的数据,也是比较类似的操作,本文就不再赘述了。

  • 2.3 案例二:读入xml文档并分析,将其内容输出
  • 了解了实现思想后,我们就直接改写顺序查找算法,用二分查找思想来实现查找
    首先,待分析的文档如下:
  • [XML] 纯文本查看 复制代码
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
    <students name="zhangsan">
        <hello name="lisi">hello Text1</hello>
        <hello name="lisi2">hello Text2</hello>
        <hello name="lisi3">hello Text3</hello>
        <world name="wangwu">world text1</world>
        <world name="wangwu2">world text2</world>
        <world >world text3</world>
    </students>



  • 代码思路:由外而内的取获取节点读取数据

    • 获取整个文档
    • 获取根元素students
    • 遍历根元素students获取每个子元素
    • 然后通过元素拿到对应的名称、属性值等数据


以下是代码实现

[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
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
import java.io.File;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.SAXReader;

public class Dom4JTest2 {
    public static void main(String[] args) throws Exception {
        SAXReader saxReader = new SAXReader();
                // 获取文档对象      
        Document document = saxReader.read(new File("students.xml"));

        // 获取根元素
        Element root = document.getRootElement();
        System.out.println("Root: " + root.getName());

        // 获取所有子元素
        List<Element> childList = root.elements();
        System.out.println("total child count: " + childList.size());

        // 获取特定名称的子元素
        List<Element> childList2 = root.elements("hello");
        System.out.println("hello child: " + childList2.size());

        // 获取名字为指定名称的第一个子元素
        Element firstWorldElement = root.element("world");
        // 输出其属性
        System.out.println("first World Attr: "
                + firstWorldElement.attribute(0).getName() + "="
                + firstWorldElement.attributeValue("name"));
        System.out.println("迭代输出-----------------------");

        // 迭代输出
        for (Iterator iter = root.elementIterator(); iter.hasNext();) {
            Element e = (Element) iter.next();
            System.out.println(e.attributeValue("name"));               
        }

        System.out.println("用DOMReader-----------------------");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 注意要用完整类名
        org.w3c.dom.Document document2 = db.parse(new File("students.xml "));      
        DOMReader domReader = new DOMReader();

        // 将JAXP的Document转换为dom4j的Document
        Document document3 = domReader.read(document2);               
        Element rootElement = document3.getRootElement();
        System.out.println("Root: " + rootElement.getName());
    }
}



控制台输出:
Root: studentstotal child count: 6hello child: 3first World Attr: name=wangwu迭代输出-----------------------lisilisi2lisi3wangwuwangwu2null用DOMReader-----------------------Root: students


3. 总结到目前为止我们已经用Dom4j完成了生成XML文档以及解析XML文档的操作,相信大家已经对Dom4j有了一定的了解,更复杂的XML只是操作起来步骤更多而已,其思路都是类似的。祝大家学有所成



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马