一、引言
在当今的软件开发领域,数据的存储和交换至关重要。XML(Extensible Markup Language)作为一种可扩展的标记语言,以其灵活的数据表示方式和良好的跨平台性,在程序配置、数据交换等方面发挥着重要作用。本文将详细介绍 XML 的语法、约束、解析技术,以及相关的 DOM4J 和 XPath 知识。
二、XML 概述
2.1 什么是 XML
XML 全称为可扩展的标记语言,是 SGML(标准通用标记语言)的一个子集。与 HTML 不同,HTML 的元素是固定的,而 XML 的标签可以由用户自定义。W3C 在 1998 年 2 月发布了 XML 1.0 版本,虽然 2004 年 2 月发布了 1.1 版本,但由于其不能向下兼容 1.0 版本,所以目前广泛使用的仍是 1.0 版本。
2.2 W3C 组织
W3C 即万维网联盟,成立于 1994 年 10 月,以开放论坛的方式促进 Web 技术的发展。它发布的规范虽称为推荐标准,但因其权威性往往成为事实上的标准。
2.3 XML 的作用
- 程序的配置文件:这是 XML 最常见的用途之一,通过 XML 文件可以方便地配置程序的各种参数。
- 数据交换:不同语言的程序之间可以使用 XML 进行数据交换,因为 XML 具有良好的可读性和通用性。
- 小型数据库:可以将 XML 用作简单的数据库来存储数据。
2.4 XML 与 HTML、properties 文件的比较
- 与 HTML 比较:HTML 元素固定,由浏览器解析执行,主要用于表示网页;而 XML 可自定义元素,解析器通常需要自己编写,用途更为广泛。
- 与 properties 文件比较:属性文件只能存储平面信息,解析简单;而 XML 可以存储结构化信息,但解析较为复杂。
三、XML 语法概述
3.1 XML 文档展示
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student number="1001">
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="1002">
<name>liSi</name>
<age>32</age>
<sex>female</sex>
</student>
<student number="1003">
<name>wangWu</name>
<age>55</age>
<sex>male</sex>
</student>
</students>
3.2 XML 文档的组成部分
- XML 文档声明:用于说明 XML 文档的版本、编码等信息。
- XML 处理指令:用于向 XML 处理器提供信息。
- XML 元素:XML 文档的基本组成部分,包含开始标签、元素体和结束标签。
- XML 特殊字符和 CDATA 区:特殊字符需要使用转义字符表示,CDATA 区用于包含大量特殊字符,提高文档可读性。
- XML 注释:以
<!--
开头,以-->
结束,用于对文档进行说明。
3.3 XML 文档声明
- 结构:包含
version
、encoding
和standalone
三个属性。version
:必须属性,指定 XML 文档的版本,通常为 1.0。encoding
:可选属性,指定文档使用的字符编码集,默认为 UTF - 8。standalone
:指定文档是否为独立文档,默认值为yes
。
- 注意事项:XML 文档声明必须从文档的第一行第一列开始,且大小写敏感。
3.4 XML 元素
- 格式:
- 包含开始标签、元素体和结束标签,如
<hello>大家好</hello>
;空元素需闭合,如<hello/>
。 - 元素可以包含子元素或文本数据,且必须合法嵌套。
- 包含开始标签、元素体和结束标签,如
- 根元素:格式良好的 XML 文档必须且仅有一个根元素。
- 元素命名规范:区分大小写,不能以数字开头,最好不以
xml
开头,不能包含空格。
3.5 元素属性
- 属性由属性名和属性值组成,中间用等号连接,属性值必须用引号括起来。
- 定义属性需遵循与标签名相同的命名规范,且一个元素中不能包含相同的属性名。
3.6 注释
注释以 <!--
开头,以 -->
结束,注释中不能包含 --
。
3.7 转义字符和 CDATA 区
- 转义字符:在 XML 文档中,一些特殊字符如
<
、>
等需要使用转义字符表示,如<
表示<
。 - CDATA 区:当大量特殊字符出现时,使用 CDATA 区可以提高文档的可读性。CDATA 区以
<![CDATA[
开头,以]]>
结束,其中的特殊字符无需转义,但不能包含]]>
。
四、XML 约束(了解)
4.1 XML 约束概述
由于 XML 文档可以自定义元素,应用程序为了满足自身需求,通常要求 XML 文件的结构固定。XML 约束就是用另一个文件来约束 XML 文档的结构,常见的约束类型有 DTD 和 Schema。
4.2 DTD
- 定义:DTD(Document Type Definition)即文档类型定义,用于约束 XML 文档。
- 示例:
<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
解读:students
元素中可以包含 1 到多个 student
元素;student
元素必须包含 name
、age
、sex
元素,且顺序固定;这些元素的内容为文本。
4.3 Schema
- 概述:学习 Schema 的目标一是参照其要求编写 XML 文档,二是自己定义 Schema 文档。
- 优点:基于 XML 语法,可使用处理 XML 文档的工具处理;扩充了数据类型,支持自定义数据类型;支持元素的继承和属性组;支持命名空间,避免命名冲突。
五、XML 解析
5.1 操作 XML 文档概述
对 XML 文档的操作主要包括增删改查(CRUD),XML 解析方式分为 DOM(Document Object Model)和 SAX(Simple API for XML),这两种方式是跨语言的解析方式。
5.2 DOM4J
- 概述:DOM4J 是专门为 Java 开发人员提供的 XML 文档解析规范,与 DOM 相似但更方便。它支持 DOM 和 SAX 模式,解析结果是
org.dom4j.Document
对象。 - 类结构:在 DOM4J 中,所有 XML 组成部分都是一个
Node
,Document
和Element
等可以包含子节点的节点是Branch
的子接口。 - 获取 Document 对象:
SAXReader reader = new SAXReader();
Document doc = reader.read("src/students.xml");
- 保存 Document 对象:
doc.addDocType("students", "", "students.dtd");
OutputFormat format = new OutputFormat("\t", true);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter(xmlName), format);
writer.write(doc);
writer.close();
- 创建 Document 对象:
Document doc = DocumentHelper.createDocument();
5.3 Document 操作
以遍历 students.xml
为例:
// 获取 Document 对象
SAXReader reader = new SAXReader();
Document doc = reader.read("src/students.xml");
// 获取根元素
Element root = doc.getRootElement();
// 获取根元素的所有子元素
List<Element> studentList = root.elements();
// 遍历每个 student 元素
for (Element student : studentList) {
// 打印 student 元素的 number 属性
String number = student.attributeValue("number");
System.out.println("Number: " + number);
// 打印 student 元素的 name 子元素内容
String name = student.elementText("name");
System.out.println("Name: " + name);
// 打印 student 元素的 age 子元素内容
String age = student.elementText("age");
System.out.println("Age: " + age);
// 打印 student 元素的 sex 子元素内容
String sex = student.elementText("sex");
System.out.println("Sex: " + sex);
}
5.4 XPath
- 定义:XPath 是一种用于确定 XML 文档中某部分位置的语言,基于 XML 的树状结构,可用于小型查询。
- DOM4J 对 XPath 的支持:
Node
接口中的三个常用方法:List selectNodes(String xpathExpression)
:查找满足 XPath 表达式的所有子节点。Node selectSingleNode(String xpathExpression)
:查找满足 XPath 表达式的第一个子节点。String valueOf(String xpathExpression)
:查找满足 XPath 表达式的第一个子节点的文本内容。