一、前言
在编程中,XML (可扩展标记语言)是一种常用于存储和交换数据的标记语言,它具有良好的人机可读性和通用性。在本文中,我们将探讨XML
的各个方面,包括XML的介绍与用途 、语法规则 、语义约束 、Java中的XML解析 以及XPath路径表达式。
二、内容
2.1 XML介绍与用途
什么是 XML
XML的全称是EXtensible Markup Language
,可扩展标记语言。与HTML类似,XML也是通过标签来描述数据的格式和结构,但XML更加通用,不仅用于网页,还用于数据的存储和交换。
XML示例:
xml
<!-- hr.xml -->
<employee>
<name>王五</name>
<age>18</age>
<height>170</height>
</employee>
XML vs HTML
XML
和 HTML
都使用标签来描述文档结构,但它们有一些关键区别:
xml
<school>
<class no="G3N1">
<grade>大二</grade>
<name>5班</name>
</class>
<class no="G3N2">
<grade>大二</grade>
<name>6班</name>
</class>
</school>
html
<body>
<a href="index.html">首页</a>
</body>
主要区别:
- XML是通用的数据描述语言 ,而HTML用于呈现文档。
- XML强调数据的结构和内容 ,而HTML强调文档的呈现和布局
2.2 XML的语法规则
XML 文档结构
XML文档必须遵循一定的结构规则:
- 第一行必须是XML声明,包含版本号和字符集信息。
- XML文档有且只有一个根节点。
- XML标签的书写规则与HTML相同。
XML 声明
XML 声明说明 XML文档 的基本信息,包括版本号与字符集,写在 XML第一行。
xml
<?xml version="1.0" encoding="UTF-8"?>
其中:
version
代表版本号,可以是 1.0 或 1.1encoding UTF-8
设置字符集,用于支持中文
合法的标签名
XML
标签名必须遵循一些规则:
xml
<abc>abc</abc> <!-- 合法,但不推荐,无意义 -->
<考试$>数学期末</考试$> <!-- 不合法,不能包含特殊字符$ -->
<class><class>班级</class></class> <!-- 不合法,标签名重复 -->
<shop-cart><item>照片</item></shop-cart> <!-- 合法 -->
适当的注释与缩进
为了提高XML文档的可读性,建议使用注释和缩进:
xml
<!-- 这是一个示例XML文档 -->
<employee>
<name>王五</name>
<age>18</age>
<height>180</height>
</employee>
合理使用属性
XML标签可以包含属性,用于提供额外的信息:
xml
<book title="Harry Potter" author="J.K. Rowling">
<chapter>Chapter 1</chapter>
</book>
处理特殊字符
在标签体中出现 "<
" 、">
" 等特殊字符可能会破坏文档结构,需要特殊处理:
解决方案:
-
使用实体引用。
可以使用实体引用来代替特殊字符:
实体引用 对应符号 说明 <
<
小于 >
>
大于 &
&
和号 '
'
单引号 "
"
双引号 -
使用CDATA标签。
CDATA标签用于包含不应由XML解析器解析的文本数据:
比如:
xml<description><![CDATA[This is a <b>bold</b> text.]]></description>
有序的子元素
在多层嵌套的子元素中,标签的前后顺序应保持一致,以维护数据的结构完整性。
2.3 XML语义约束
XML文档结构正确,但可能不是有效的。XML语义约束用于规定XML文档中允许出现哪些元素。
例如,员工档案
XML
中绝不允许出现"植物品种" 标签。XML
语义约束就是用于规定XML
文档中允许出现哪些元素。
XML语义约束有两种定义方式:DTD
与 XML Schema
。
Document Type Definition
DTD
(Document Type Definition
,文档类型定义)是一种简单的语义约束方式,用于规定XML文档的结构。
DTD
文件的扩展名为 .dtd
。
比如:
dtd
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
...
DTD 定义节点
利用 DTD
中的标签,我们可以定义 XML
文档中允许出现的节点及其数量。
比如:
- 定义
hr
节点下只允许出现1
个employee
子节点:
dtd
<!ELEMENT hr (employee)>
employee
节点下必须包含name
、age
、salary
和department
节点,并按顺序出现:
dtd
<!ELEMENT employee (name,age,salary,department)>
- 定义
name
标签体只能是文本,#PCDATA
代表文本元素:
dtd
<!ELEMENT name (#PCDATA)>
DTD 定义节点数量
如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符:
hr
节点下最少出现 1 个employee
子节点。
dtd
<!ELEMENT hr (employee+)>
hr
节点下可出现0...n
个employee
子节点。
dtd
<!ELEMENT hr (employee*)>
hr
节点下最多出现1
个employee
子节点。
dtd
<!ELEMENT hr (employee?)>
XML 引用 DTD 文件
在 XML
中使用 <!DOCTYPE>
标签来引用 DTD
文件。
书写格式如下:
xml
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
举个例子:
xml
<!DOCTYPE hr SYSTEM "hr.dtd">
XML Schema
XML Schema(XML模式)是一种用于定义XML文档结构和数据类型的替代DTD的方案。与DTD相比,XML Schema提供了更强大和灵活的工具来描述XML文档的结构和语义。
XML Schema支持丰富的数据类型,如字符串、整数、日期、布尔值等。允许我们定义更复杂的数据约束,如最小值、最大值、正则表达式模式等。同时, XML Schema文档本身是一个XML文档,因此具有更好的自描述性,提供了更强大的命名空间支持,并允许我们定义元素和属性的子元素、顺序、出现次数等规则,从而更精确地描述文档结构。
举个例子:
xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
<complexType>
<sequence>
<element name="employee" minOccurs="1" maxOccurs="9999">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age">
<simpleType>
<restriction base="integer">
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
<element name="salary" type="integer"></element>
<element name="department">
<complexType>
<sequence>
<element name="dname" type="string"></element>
<element name="address" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
这个XML Schema为XML文档定义了严格的结构和数据类型规则,确保XML文档符合人力资源管理系统的要求。XML文档必须遵循这些规则,否则将被视为无效。
2.4 Java 解析 XML
DOM 文档对象模型
DOM是一种用于解析XML的模型,将XML文档视为树形结构,可以方便地遍历和修改XML文档。
Dom4j
Dom4j是一个开源的Java库,用于解析和操作XML文档。它易于使用,性能优异,并提供了丰富的功能。
- Dom4j 将 XML 视为 Document 对象。
- XML 标签被 Dom4j 定义为 Element 对象。
利用 Dom4j 遍历 XML
java
// 导入Dom4j相关类
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class XMLParser {
public static void main(String[] args) {
try {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 读取XML文件
Document document = reader.read("hr.xml");
// 获取根节点
Element root = document.getRootElement();
// 遍历子元素
for (Element employee : root.elements("employee")) {
String name = employee.elementText("name");
String age = employee.elementText("age");
System.out.println("Name: " + name + ", Age: " + age);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
利用 Dom4j 更新 XML
java
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class XMLUpdater {
public static void main(String[] args) {
try {
// 创建空的XML文档
Document document = DocumentHelper.createDocument();
// 创建根节点
Element root = document.addElement("employees");
// 创建子节点
Element employee = root.addElement("employee");
employee.addElement("name").setText("李四");
employee.addElement("age").setText("25");
// 将XML写入文件
XMLWriter writer = new XMLWriter(new FileWriter("new_hr.xml"));
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.5 XPath 路径表达式
XPath 路径表达式
XPath是一种用于在XML文档中查找数据的语言,它允许通过路径表达式定位XML文档中的元素。
- 掌握
XPath
可以极大的提高在提取数据时的开发效率。- 学习
XPath
本质就是掌握各种形式表达式的使用技巧。
XPath 基本表达式
最常用的基本表达式:
/
:从根节点开始选取//
:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置element
:选取指定名称的元素@attribute
:选取指定名称的属性text()
:选取元素的文本内容
XPath 基本表达式案例
比如:
xml
<books>
<book>
<title>XML Basics</title>
<author>John Doe</author>
</book>
<book>
<title>Java Programming</title>
<author>Jane Smith</author>
</book>
</books>
示例XPath表达式:
/books
:选取根元素books/books/book
:选取根元素下的book元素//author
:选取所有author元素/books/book[1]
:选取第一个book元素/books/book/title/text()
:选取第一个book元素的 title 文本内容
XPath 谓语表达式
谓语表达式用于过滤元素,可以根据条件来选择元素:
比如:
/books/book[author='John Doe']
:选取作者为'John Doe'的book元素/books/book[price>20]
:选取价格大于20的book元素
三、总结
本文介绍了XML的各个方面,包括XML的基本介绍与用途、语法规则、语义约束、Java中的XML解析以及XPath路径表达式。总的来说,XML是一种强大的数据交换格式,掌握它将有助于处理和管理各种数据源。