一、核心定义与定位
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言
核心特点是:
- 可扩展 :你可以自定义标签(比如
<book>、<user>),而非像 HTML 那样只能用预定义标签(<div>、<p>)。 - 平台无关:跨语言、跨系统,是不同系统间数据交换的通用格式。
- 易读易解析:人类可直接阅读,机器也能通过解析器轻松处理。
简单比喻:XML 就像 "数据的说明书",只描述数据是什么 (比如 "这是一本书的标题"),不描述数据怎么展示(这是 HTML 的职责)
二、XML 核心语法规则
XML 有严格的语法规范,违反则解析器会报错,核心规则如下:
基本结构(文档声明 + 根元素)
一个完整的 XML 文档必须包含:
- 文档声明(可选但推荐):定义 XML 版本、编码等
- 唯一的根元素:所有其他元素都嵌套在根元素内
示例(基础结构):
xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 文档声明:版本1.0,编码UTF-8 -->
<library> <!-- 根元素:整个文档只有一个根 -->
<book> <!-- 子元素 -->
<title>Python编程:从入门到实践</title>
<author>埃里克·马瑟斯</author>
<price>89.00</price>
</book>
</library>
核心语法规则(必须遵守)
| 规则 | 说明 | 错误示例 | 正确示例 |
|---|---|---|---|
| 标签必须闭合 | 所有标签要么成对(<a></a>),要么自闭合(<img />) |
<price>89.00 |
<price>89.00</price> 或 <br /> |
| 标签大小写敏感 | <Book> 和 <book> 是不同标签 |
<Book><title>...</Book>(闭合用<book>) |
<book><title>...</book> |
| 元素必须正确嵌套 | 子元素必须完全包含在父元素内 | <book><title>Python</book></title> |
<book><title>Python</title></book> |
| 属性值必须加引号 | 属性(key="value")的值必须用单 / 双引号包裹 | <book id=123> |
<book id="123"> 或 <book id='123'> |
| 特殊字符转义 | 不能直接用 < > & " ',需转义 |
<price>89 & 99</price> |
<price>89 & 99</price> |
转义字符对照表:
| 原字符 | 转义字符 | 说明 |
|---|---|---|
< |
< |
小于号 |
> |
> |
大于号 |
& |
& |
和号 |
" |
" |
双引号 |
' |
' |
单引号 |
常见扩展语法
-
注释 :格式为
<!-- 注释内容 -->,不会被解析器处理xml<!-- 这是一本Python相关的书籍 --> <book id="123"> <title>Python编程:从入门到实践</title> </book> -
CDATA 段 :用于包裹无需转义的文本(比如代码、特殊字符),格式为
<![CDATA[ 内容 ]]>xml<book> <description> <![CDATA[ 本书包含Python代码:print(10 > 5) & print("Hello") ]]> </description> </book> -
命名空间 :解决标签名冲突(比如两个
<book>来自不同模块),用xmlns定义xml<?xml version="1.0" encoding="UTF-8"?> <lib:library xmlns:lib="http://example.com/library" <!-- 定义命名空间前缀lib --> xmlns:store="http://example.com/store"> <lib:book id="123">Python编程</lib:book> <store:book id="456">Java编程</store:book> </lib:library>
三、XML 解析(实战示例)
XML 的核心价值是 "传输 / 存储数据",实际开发中需要用代码解析 XML 提取数据,这里以 Python 为例(最常用的两种方式):
前置条件
确保安装了 Python 内置的解析库(无需额外安装):xml.etree.ElementTree(轻量)、xml.dom.minidom(DOM 方式)
示例:解析 XML 文件
假设有books.xml文件:
xml
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>Python编程:从入门到实践</title>
<author>埃里克·马瑟斯</author>
<price>89.00</price>
</book>
<book id="2">
<title>Java核心技术</title>
<author>凯·霍斯特曼</author>
<price>129.00</price>
</book>
</library>
用ElementTree解析的代码:
python
import xml.etree.ElementTree as ET
# 1. 解析XML文件
tree = ET.parse("books.xml")
root = tree.getroot() # 获取根元素<library>
# 2. 遍历所有<book>元素,提取数据
for book in root.findall("book"):
book_id = book.get("id") # 获取属性值
title = book.find("title").text # 获取子元素文本
author = book.find("author").text
price = book.find("price").text
print(f"书籍ID:{book_id},标题:{title},作者:{author},价格:{price}")
# 输出结果:
# 书籍ID:1,标题:Python编程:从入门到实践,作者:埃里克·马瑟斯,价格:89.00
# 书籍ID:2,标题:Java核心技术,作者:凯·霍斯特曼,价格:129.00
四、XML 典型使用场景
- 数据交换 :不同系统(比如 Java 后端和 Python 后端)间传输数据(虽现在 JSON 更常用,但老系统仍大量使用)
- 配置文件 :很多框架 / 工具用 XML 做配置(比如 Spring、MyBatis、AndroidManifest.xml)
- 数据存储 :小型应用的结构化数据存储(比如电子书元数据、配置清单)
- 文档规范 :用于定义数据格式(比如 XML Schema、DTD),确保数据交换的一致性
五、XML vs JSON(核心对比)
| 维度 | XML | JSON |
|---|---|---|
| 语法复杂度 | 复杂(标签嵌套、声明、转义) | 简洁(键值对、数组) |
| 可读性 | 偏繁琐,但结构清晰 | 更易读,适合人类快速理解 |
| 解析效率 | 较低(需解析标签) | 较高(轻量,解析更快) |
| 扩展性 | 强(命名空间、Schema) | 弱(无原生扩展机制) |
| 适用场景 | 老系统、配置文件、严格的文档规范 | 现代 API、前端后端数据交互 |
总结
- XML 是可扩展的标记语言 ,核心用于存储 / 传输结构化数据,语法严格(标签闭合、嵌套、转义是关键)
- XML 的核心优势是可扩展、跨平台,但语法繁琐,现在数据交互场景逐渐被 JSON 替代,主要用于老系统和配置文件
- 解析 XML 时需遵守语法规则,常用工具(如 Python 的 ElementTree)可快速提取标签、属性、文本数据