侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 743 篇文章
  • 累计创建 64 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

XML解析之Dom4j

zze
zze
2017-10-08 / 0 评论 / 0 点赞 / 489 阅读 / 3134 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

介绍

XML 解析方式有很多种,但是常用的有两种,如下:

Dom

Document Object Model:把整个 XML 读到内存中,形成树状结构。整个文档为 Document 对象,属性为 Attribute 对象,元素节点为 Element 对象,文本也可以称之为 Text 对象,以上所有对象都可以称之为 Node 节点。如果 XML 特别大,那么会造成内存溢出。可以利用它对 XML 文档进行增删操作。

Sax

Simple API for XML:基于事件驱动,读取一行,解析一行。不会造成内存溢出。只能查询,不可以进行增删操作。
下面就是使用 Sax 方式解析的示例。

依赖及文档下载

使用示例

有如下测试 XML 文件:

<!-- student.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student>
        <name id="1">杨幂</name>
        <age>32</age>
    </student>
    <student>
        <name>郭德纲</name>
        <age>18</age>
    </student>
</students>

解析:

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class XMLParseTest {
    /**
     * Element 方式解析
     */
    @Test
    public void test1() {
        try {
            // 创建 SAX 读取对象
            SAXReader saxReader = new SAXReader();
            // 指定读取源
            Document document = saxReader.read(this.getClass().getClassLoader().getResourceAsStream("com/zze/xml/student.xml"));
            // 获取根元素
            Element rootElement = document.getRootElement();
            List<Element> studentElements = rootElement.elements("student");
            for (Element studentElement : studentElements) {
                String name = studentElement.element("name").getText();
                Integer age = Integer.parseInt(studentElement.element("age").getText());
                System.out.println(String.format("name:%s", name));
                System.out.println(String.format("age:%s", age));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * XPath 方式解析
     * 要使用 XPath ,需要添加 jar 支持:jaxen-1.1-beta-6.jar
     */
    @Test
    public void test2() {
        Document document = null;
        try {
            SAXReader saxReader = new SAXReader();
            document = saxReader.read(this.getClass().getClassLoader().getResourceAsStream("com/zze/xml/student.xml"));
            Element rootElement = document.getRootElement();
            // 获取文档中所有 name 节点
            List<Element> nameElements = rootElement.selectNodes("//name");
            for (Element nameElement : nameElements) {
                System.out.println(nameElement.attribute("id") != null ? nameElement.attribute("id").getText() : "");
                System.out.println(nameElement.getText());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}
0

评论区