一、简介
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>
其中site
、name
、url
、desc
表示标签名称,内容表示标签对应的值。
因 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 文件解析,解析速度很快,也是一个不错的选择。
写到最后
不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!