(21)100天python从入门到拿捏《XML 数据解析》

XML 解析

文章目录

  • [XML 解析](#XML 解析)
    • [一、XML 概述](#一、XML 概述)
    • [二、XML 的应用场景](#二、XML 的应用场景)
    • [三、Python3 中的 XML 解析方式](#三、Python3 中的 XML 解析方式)
    • [四、使用 `xml.etree.ElementTree` 解析 XML](#四、使用 xml.etree.ElementTree 解析 XML)
    • [五、使用 `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 数据解析》

相关推荐
卷无止境3 小时前
智能体开发环境ADE浅析,编程工具的下一次范式跃迁
后端·python
彧azz5 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
嵌入式学习菌6 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
matlab代码6 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
2601_962300817 小时前
机器学习贴士:使用Python编写MapReduce
hadoop·python·机器学习·mapreduce·数据处理
matlab代码7 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
xyz_CDragon7 小时前
GitHub上4个爆款AI开源Skill:拍照后不用P图,用Codex一键生成高级海报(附效果图+使用教程)
人工智能·python·github·codex·skill
wuyk5557 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080167 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦7 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt