XML 解析
文章目录
- XML 解析
- 一、XML 概述
- 1. 什么是 XML
- 2. XML 的发展历史
- 3.XML、JSON和YAML语法对比
- 二、XML 的应用场景
- 三、Python3 中的 XML 解析方式
- 四、使用 `xml.etree.ElementTree` 解析 XML
- 1. 解析并读取节点
- 输出结果:
- 五、使用 `minidom`解析 XML
- 六、使用 `lxml` 实现高级解析
- 七、生成 XML 文件
- 八、XML 与 JSON 的比较
一、XML 概述
1. 什么是 XML
XML(eXtensible Markup Language,可扩展标记语言) 是一种用于存储和传输数据的标记语言。它与 HTML 相似,但用途不同
- HTML 是为显示数据而设计的;
- XML 是为存储与传输数据而设计的。
2. XML 的发展历史
- 1998 年:由万维网联盟正式发布 XML 1.0 标准。
- 设计目标:在互联网早期解决不同系统之间数据交换的格式问题。
- 核心理念:让数据“自描述化”,即数据结构和内容都包含在文档中。
- 现代替代者:JSON、YAML 等格式后来在网络开发中逐渐取代了部分 XML 的应用场景,但在企业系统、文档格式如 SVG、RSS、Office XML中仍被广泛使用。
3.XML、JSON和YAML语法对比
XML:基于标签的树结构,显式节点/属性,有文本节点、注释、处理指令。
<person id="123">
<name>张三</name>
<age>30</age>
</person>
JSON:键值对与数组,数据类型明晰。
{
"id": "123",
"name": "张三",
"age": 30
}
YAML:缩进表示层级,支持简短语法、序列及锚点,允许注释。
yaml目前是配置文件的主流
容器与编排配置,定义服务拓扑、容器镜像、网络、工作流配置
代理节点 / 网络配置,定义节点、策略组、路由规则
机器学习与深度学习当中的模型结构、超参数、训练策略配置
应用系统配置文件如Spring Boot 中的
application.yml在AI 工程领域如 LlamaIndex、LangChain、均采用 YAML 描述链路
id: "123"
name: 张三
age: 30
二、XML 的应用场景
| 应用领域 | 案例 | 说明 |
|---|---|---|
| 企业数据交换 | SOAP、WSDL | XML 是 Web Service 的数据载体 |
| ⚙️ 配置文件 | AndroidManifest.xml、Spring 配置 | 结构化、层次分明 |
| 办公文件 | DOCX、XLSX、PPTX | 实际上都是 XML 的压缩包 |
| 数据订阅 | RSS、Atom | 新闻聚合和订阅系统 |
| 嵌入式/IoT | 硬件配置文件 | 适用于多层嵌套配置 |
三、Python3 中的 XML 解析方式
Python 内置了多个用于解析 XML 的库,适用于不同复杂度的应用
| 模块 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
xml.etree.ElementTree | 内置库 | 简单易用、轻量级 | 小型 XML 文件解析 |
xml.dom.minidom | 内置库 | 遵循 DOM 标准、内存消耗大 | 需要完整文档结构时 |
xml.sax | 内置库 | 事件驱动型解析、节省内存 | 处理大型 XML 流 |
lxml | 第三方库 | 性能高、支持 XPath、HTML | 企业级复杂解析 |
四、使用 xml.etree.ElementTree 解析 XML
初学推荐
xml.etree.ElementTree 是最常用的 XML 解析库,它将 XML 转换为树形结构,支持节点遍历、修改和写入。
操作student.xml文件
<?xml version="1.0"?><school><student id="001"><name>张三</name><age>20</age><major>Computer Science</major></student><student id="002"><name>李四</name><age>22</age><major>Data Science</major></student></school>
1. 解析并读取节点
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('student.xml')
root = tree.getroot() # 获取根节点
# 输出根节点名称
print("根节点:", root.tag)
# 遍历所有子节点
for student in root.findall('student'):
sid = student.get('id')
name = student.find('name').text
age = student.find('age').text
major = student.find('major').text
print(f"学号: {sid}, 姓名: {name}, 年龄: {age}, 专业: {major}")
输出结果:

五、使用 minidom解析 XML
xml.dom.minidom 提供了标准 Document Object Model接口,适合需要修改、插入、删除节点的复杂文档。
from xml.dom.minidom import parse
dom = parse('student.xml')
root = dom.documentElement
students = root.getElementsByTagName("student")
for s in students:
sid = s.getAttribute("id")
name = s.getElementsByTagName("name")[0].firstChild.data
print(f"学号:{sid} 姓名:{name}")
输出:
六、使用 lxml 实现高级解析
这是企业级应用
lxml 是一个高性能的 XML/HTML 解析库,支持 XPath、XSLT、Schema 校验 等高级功能。
from lxml import etree
# 解析XML
tree = etree.parse('student.xml')
root = tree.getroot()
# 使用XPath查询
names = root.xpath("//student/name/text()")
print("所有学生姓名:", names)
# 查询特定条件
students = root.xpath("//student[age>20]/name/text()")
print("年龄>20的学生:", students)
输出:

七、生成 XML 文件
这里的创建是从零创建
import xml.etree.ElementTree as ET
root = ET.Element('library')
book = ET.SubElement(root, 'book', {'id': '001'})
ET.SubElement(book, 'title').text = 'Python编程'
ET.SubElement(book, 'author').text = 'Guido van Rossum'
tree = ET.ElementTree(root)
tree.write('library.xml', encoding='utf-8', xml_declaration=True)
生成结果:

八、XML 与 JSON 的比较
| 特性 | XML | JSON |
|---|---|---|
| 数据结构 | 树状结构 | 键值对结构 |
| 可读性 | 可读性高但冗余 | 简洁清晰 |
| 扩展性 | 强,支持属性与命名空间 | 弱 |
| 传输体积 | 大 | 小 |
| 典型用途 | WebService、配置文件 | API 数据传输 |
在现代 Web 开发中,JSON 更轻量、解析更快,但在需要复杂层次结构和元信息如属性、命名空间的系统中,XML 仍具优势。