XML全称为可扩展标记语言,和HTML同属标记语言家族,但两者的设计目标完全不同,HTML主要用于展示数据,而XML的核心作用是传输和存储数据,同时允许用户自定义标签,灵活性极强。很多新手刚接触XML时会觉得它和HTML很像,但两者的语法规则和应用场景有本质区别,学习时需要先理清核心定位。

XML基础语法规则
XML的语法有严格的规范要求,不符合规则的文档会被解析器判定为无效,以下是必须遵守的核心规则:
- XML文档必须包含根元素,所有其他元素都必须是根元素的子元素,不能存在游离在根元素之外的内容
- 标签必须成对出现,有开始标签就必须有对应的结束标签,标签名区分大小写,比如<user>和<User>是两个不同的标签
- 标签必须正确嵌套,不能出现交叉嵌套的情况,例如<user><name>张三</user></name>就是错误的写法
- 属性值必须用引号包裹,单引号和双引号都可以,但同一个属性值不能混用两种引号
- XML文档开头通常需要声明版本和编码,格式为<?xml version="1.0" encoding="UTF-8"?>
XML文档结构示例
一个标准的XML文档结构清晰,层级分明,下面是一个存储用户信息的XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 用户信息集合根元素 -->
<users>
<user id="1001">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
<hobby>篮球</hobby>
</user>
<user id="1002">
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
<hobby>阅读</hobby>
</user>
</users>XML特殊字符处理
XML中有五个预定义的实体引用,当文档中需要出现这些特殊字符时,不能直接书写,必须使用对应的实体引用,否则会导致解析错误:
| 特殊字符 | 实体引用 | 说明 |
|---|---|---|
| < | < | 小于号,标签的起始符号,直接使用会干扰解析 |
| > | > | 大于号,标签的结束符号,直接使用会干扰解析 |
| & | & | 和号,实体引用的起始符号,直接使用会触发实体解析逻辑 |
| ' | ' | 单引号,属性值使用单引号包裹时,内部出现单引号需要转义 |
| " | " | 双引号,属性值使用双引号包裹时,内部出现双引号需要转义 |
XML合法性校验
XML文档分为格式良好和合法两种状态,格式良好只需要符合上述基础语法规则,而合法还需要符合对应的DTD或者XML Schema定义的结构约束。如果想要校验XML文档的合法性,可以编写对应的DTD文件,示例如下:
<!-- 定义users根元素,包含多个user子元素 --> <!ELEMENT users (user+)> <!-- 定义user元素,包含name、age、email、hobby四个子元素,同时有id属性 --> <!ELEMENT user (name,age,email,hobby)> <!ATTLIST user id CDATA #REQUIRED> <!-- 定义四个子元素的内容类型为文本 --> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT hobby (#PCDATA)>
将DTD文件和XML文档关联后,解析器就会按照DTD的规则校验XML的内容,不符合约束的文档会被判定为不合法。
XML基础解析思路
实际开发中我们很少手动处理XML内容,通常会使用对应的解析器来读取XML数据。以Python的xml.etree.ElementTree模块为例,解析上述用户XML文档的代码如下:
import xml.etree.ElementTree as ET
# 解析XML文档,如果是字符串内容可以使用ET.fromstring()方法
tree = ET.parse('users.xml')
# 获取根元素
root = tree.getroot()
# 遍历所有user子元素
for user in root.findall('user'):
# 获取user的id属性
user_id = user.get('id')
# 获取子元素内容
name = user.find('name').text
age = user.find('age').text
email = user.find('email').text
hobby = user.find('hobby').text
print(f'用户ID:{user_id},姓名:{name},年龄:{age},邮箱:{email},爱好:{hobby}')XML的应用场景非常广泛,除了数据存储和传输,很多框架的配置文件也采用XML格式,掌握XML的基础用法是后续学习相关技术的重要基础。