Bootstrap

XML解析系列(一) -DOM 技术解析实现介绍

一、简介

XML,一种可扩展标记语言,通常被开发人员用来传输和存储数据,定义也比较简单,通常如下方式开头,用来表述文档的一些信息。

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

例如下面这个简单的文档。

<?xml version="1.0" encoding="UTF-8"?>
<site>
  <name>博客网站</name>
  <url>https://www.pzblog.cn</url>
  <desc>技术学习网站</desc>
</site>

其中sitenameurldesc表示标签名称,内容表示标签对应的值。

因 XML 的平台无关性、语言无关性、系统无关性等特点,给系统之间的数据传输带来了极大的便利,广受开发者欢迎。

事实上,在 1996 年诞生之后,XML 逐渐成为了一种通用的数据交换格式。

不同的编程语言,解析 XML 的逻辑基本都是一样的,只不过实现的语法稍有不同。

今天我们就一起来学习一下,采用 Java 编程语言来解析 XML,有哪些方法以及对应的优缺点。

经过整理,通过 Java 程序解析 XML 文件,目前比较主流的有以下四种方式:

  • DOM 解析
  • SAX 解析
  • JDOM 解析
  • DOM4J 解析

本篇介绍第一种解析技术:DOM 解析!

二、DOM 解析

DOM 的全称是:Document Object Model,是 Java 中最早支持的一种 XML 解析方式,可以不用依赖任何第三方包,通过 JDK 提供的 w3c 包里面的 api,即可实现快速解析,代码编程简单。

DOM 解析 XML 文档的时候,会在内存中加载整个文档来构造层次结构,因此优势比较突出:

  • 1.能快速遍历 XML 中任意节点数据,同时允许应用程序对数据和结构做出更改
  • 2.可以在任何时候在树中上下导航,获取和操作任意部分的数据

当然也有缺点:

  • 加载小的 XML 文档问题不大,加载大的 XML 文档,内存消耗会很大,有内存溢出的风险

总的来说,DOM 解析方式,对于数据量比较小的 XML 文档,基本够用。

下面我们以如下的 XML 文件为例,介绍解析的实现过程。

<?xml version="1.0" encoding="utf-8" ?>
<class>
    <student id="1">
        <name>张三</name>
        <gender></gender>
        <age>26</age>
    </student>
    <student id="2">
        <name>里斯</name>
        <gender></gender>
        <age>36</age>
    </student>
	<student id="3">
        <name>王五</name>
        <gender></gender>
        <age>24</age>
    </student>
</class>

DOM 实现过程如下:

import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;

public class DomDemo {
    
    public static void main(String[] args) {
        // 1.获取xml文件流
        InputStream inputStream = DomDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.创建DocumentBuilderFactory对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 3.创建DocumentBuilder对象
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse(inputStream);
            NodeList stdList = d.getElementsByTagName("student");
            for (int i = 0; i <stdList.getLength() ; i++) {
                Node std = stdList.item(i);
                // 遍历标签属性
                NamedNodeMap attrs = std.getAttributes();
                for(int j=0; j< attrs.getLength(); j++){
                    Node attr = attrs.item(j);
                    System.out.println(attr.getNodeName()+":"+attr.getNodeValue());
                }
                // 遍历标签子节点
                NodeList childNodes = std.getChildNodes();
                for (int k = 0; k <childNodes.getLength() ; k++) {
                    if (childNodes.item(k).getNodeType()== Node.ELEMENT_NODE) {
                        System.out.println(childNodes.item(k).getNodeName() + ":" + childNodes.item(k).getTextContent());
                    }
                }
                System.out.println("==============");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

id:1
name:张三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

三、小结

DOM 作为 Java 中最早支持的一种 XML 解析方式,虽然有很多缺点,但是对于较小的 xml 文件解析,解析速度很快,也是一个不错的选择。

写到最后

不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!

;