XML 解析
文章目录
- [XML 解析](#XML 解析)
-
- [一、XML 概述](#一、XML 概述)
-
- [1. 什么是 XML](#1. 什么是 XML)
- [2. XML 的发展历史](#2. XML 的发展历史)
- 3.XML、JSON和YAML语法对比
- [二、XML 的应用场景](#二、XML 的应用场景)
- [三、Python3 中的 XML 解析方式](#三、Python3 中的 XML 解析方式)
- [四、使用 `xml.etree.ElementTree` 解析 XML](#四、使用
xml.etree.ElementTree
解析 XML) -
- [1. 解析并读取节点](#1. 解析并读取节点)
- [五、使用 `minidom`解析 XML](#五、使用
minidom
解析 XML) - [六、使用 `lxml` 实现高级解析](#六、使用
lxml
实现高级解析) - [七、生成 XML 文件](#七、生成 XML 文件)
- [八、XML 与 JSON 的比较](#八、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:基于标签的树结构,显式节点/属性,有文本节点、注释、处理指令。
xml
<person id="123">
<name>张三</name>
<age>30</age>
</person>
JSON:键值对与数组,数据类型明晰。
json
{
"id": "123",
"name": "张三",
"age": 30
}
YAML:缩进表示层级,支持简短语法、序列及锚点,允许注释。
yaml目前是配置文件的主流
容器与编排配置,定义服务拓扑、容器镜像、网络、工作流配置
代理节点 / 网络配置,定义节点、策略组、路由规则
机器学习与深度学习当中的模型结构、超参数、训练策略配置
应用系统配置文件如Spring Boot 中的
application.yml
在AI 工程领域如 LlamaIndex、LangChain、均采用 YAML 描述链路
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
<?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. 解析并读取节点
py
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接口,适合需要修改、插入、删除节点的复杂文档。
py
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 校验 等高级功能。
py
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 文件
这里的创建是从零创建
py
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 仍具优势。
python学习专栏导航
(1)100天python从入门到拿捏《Python 3简介》
(2)100天python从入门到拿捏《python应用前景》
(3)100天python从入门到拿捏《数据类型》
(4)100天python从入门到拿捏《运算符》
(5)100天python从入门到拿捏《流程控制语句》
(6)100天python从入门到拿捏《推导式》
(7)100天python从入门到拿捏《迭代器和生成器》
(8)100天python从入门到拿捏《函数和匿名函数》
(9)100天python从入门到拿捏《装饰器》
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
(11)100天python从入门到拿捏《模块》
(12)100天python从入门到拿捏《文件操作》
(13)100天python从入门到拿捏《目录操作》
(14)100天python从入门到拿捏《Python的错误与异常机制》
(15)100天python从入门到拿捏《面向对象编程》
(16)100天python从入门到拿捏《标准库》
(17)100天python从入门到拿捏《正则表达式》
(18)100天python从入门到拿捏《网络编程》
(19)100天python从入门到拿捏《多线程》
(20)100天python从入门到拿捏《JSON 数据解析》