news 2026/6/25 20:39:27

Python 进阶:XML 基本操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 进阶:XML 基本操作

一、XML 基础认知

XML(可扩展标记语言)是用于存储 / 传输结构化数据的格式,核心特点是标签可自定义,结构层级清晰。示例结构:

xml

<library> <!-- 根节点 --> <book id="1001"> <!-- 子节点,带属性 --> <title>Python编程</title> <!-- 叶子节点,带文本 --> <price>89.0</price> </book> </library>

Python 中处理 XML 的主流工具是内置的xml.etree.ElementTree(简称 ET),它轻量、高效,满足绝大多数 XML 处理场景。

二、核心操作实战

1. 解析 XML(读取与查询)

解析是处理 XML 的第一步,支持从文件 / 字符串解析,重点是精准提取节点数据。

准备示例文件(book.xml)

xml

<library> <book id="1001"> <title>Python编程:从入门到实践</title> <author>埃里克·马瑟斯</author> <price>89.0</price> <category>编程</category> </book> <book id="1002"> <title>XML基础教程</title> <author>李四</author> <price>59.0</price> <category>数据格式</category> </book> </library>
解析代码示例

python

运行

import xml.etree.ElementTree as ET # 1. 从文件解析XML(最常用) tree = ET.parse("book.xml") root = tree.getroot() # 获取根节点(<library>) # 2. 从字符串解析XML(适合动态生成的XML) xml_str = """ <library> <book id="1003"><title>Java编程</title><price>79.0</price></book> </library> """ root_from_str = ET.fromstring(xml_str) # 3. 基础遍历:遍历所有book节点 print("=== 基础遍历 ===") for book in root: book_id = book.get("id") # 获取节点属性 title = book.find("title").text # 查找第一个子节点并取文本 price = book.find("price").text print(f"ID: {book_id}, 标题: {title}, 价格: {price}") # 4. 进阶查询:XPath语法(精准定位) print("\n=== XPath进阶查询 ===") # 查所有价格>60的book high_price_books = root.findall(".//book[price>60]") for book in high_price_books: print(f"高价书:{book.find('title').text}") # 查id=1002的book的category category = root.find(".//book[@id='1002']/category").text print(f"ID=1002的分类:{category}")
关键解析
  • ET.parse():从文件加载 XML,返回 Tree 对象;ET.fromstring():从字符串加载,直接返回根节点。
  • get("属性名"):获取节点的属性值(如id)。
  • find("节点名"):查找第一个匹配的子节点;findall():查找所有匹配节点。
  • XPath:进阶核心,.//book表示递归查找所有 book 节点,[@id='1002']筛选属性,price>60筛选文本值。

2. 修改 XML(修改 / 添加 / 删除节点)

解析后常需要修改内容,比如更新值、新增节点、删除无用节点。

python

运行

import xml.etree.ElementTree as ET # 解析文件 tree = ET.parse("book.xml") root = tree.getroot() # 1. 修改节点内容/属性 book_1001 = root.find(".//book[@id='1001']") price_node = book_1001.find("price") price_node.text = "85.0" # 修改文本 price_node.set("currency", "CNY") # 添加/修改属性 # 2. 添加新节点 book_1002 = root.find(".//book[@id='1002']") publish_date = ET.Element("publish_date") # 创建新节点 publish_date.text = "2024-01-01" book_1002.append(publish_date) # 追加到子节点末尾 # 3. 删除节点 category_node = book_1002.find("category") book_1002.remove(category_node) # 4. 保存修改后的XML(指定编码避免中文乱码) tree.write( "modified_book.xml", encoding="utf-8", xml_declaration=True # 生成XML声明头(<?xml version='1.0'?>) ) print("XML修改完成,已保存为modified_book.xml")
关键修改
  • set("属性名", "值"):给节点添加 / 更新属性(如给 price 加货币单位)。
  • ET.Element("节点名"):创建新节点,append()/insert(索引, 节点)添加到父节点。
  • remove(节点):删除指定子节点。
  • tree.write():保存时务必指定encoding="utf-8",否则中文会乱码。

3. 生成 XML(从零创建)

有时需要完全手动构建 XML,而非修改现有文件。

python

运行

import xml.etree.ElementTree as ET # 1. 创建根节点 root = ET.Element("students") # 2. 创建子节点(推荐用SubElement,简化操作) # 第一个学生节点(带属性) student1 = ET.SubElement(root, "student") student1.set("id", "S001") ET.SubElement(student1, "name").text = "小明" ET.SubElement(student1, "age").text = "18" ET.SubElement(student1, "major").text = "计算机科学" # 第二个学生节点(直接指定属性) student2 = ET.SubElement(root, "student", id="S002") ET.SubElement(student2, "name").text = "小红" ET.SubElement(student2, "age").text = "19" ET.SubElement(student2, "major").text = "软件工程" # 3. 生成Tree并保存 tree = ET.ElementTree(root) tree.write( "students.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False # 空节点用<node></node>而非<node/> ) print("XML生成完成,已保存为students.xml")

生成的students.xml最终效果:

xml

<?xml version='1.0' encoding='utf-8'?> <students> <student id="S001"> <name>小明</name> <age>18</age> <major>计算机科学</major> </student> <student id="S002"> <name>小红</name> <age>19</age> <major>软件工程</major> </student> </students>

4. 进阶:处理 XML 命名空间

XML 命名空间(xmlns)用于避免标签名冲突(如<ns:book>),处理时需指定命名空间映射。

python

运行

import xml.etree.ElementTree as ET # 带命名空间的XML字符串 xml_with_ns = """ <library xmlns:bk="http://example.com/books"> <bk:book id="1001"> <bk:title>Python编程</bk:title> </bk:book> </library> """ root = ET.fromstring(xml_with_ns) # 定义命名空间映射(前缀→URI) ns = {"bk": "http://example.com/books"} # 必须指定namespaces参数才能查询 title = root.find(".//bk:title", namespaces=ns).text print(f"带命名空间的标题:{title}") # 输出:Python编程

三、总结

  1. Python 处理 XML 的核心工具是内置的xml.etree.ElementTree,无需额外安装,支持解析、修改、生成全流程。
  2. 解析 XML 的核心技巧:基础用find()/findall(),进阶用 XPath;修改 XML 后保存时需指定encoding="utf-8"避免中文乱码。
  3. 处理带命名空间的 XML 时,必须通过namespaces参数映射前缀与 URI,否则无法正确定位节点。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 17:57:44

回归测试框架设计:确保每次更新不破坏已有功能

回归测试框架设计&#xff1a;确保每次更新不破坏已有功能 在 AI 模型迭代日益频繁的今天&#xff0c;一个看似微小的参数调整或提示词改动&#xff0c;可能悄然破坏原本稳定的推理路径。尤其是在轻量级语言模型领域&#xff0c;每一次优化都像是在走钢丝——既要提升性能&…

作者头像 李华
网站建设 2026/6/23 19:17:09

专注于高强度推理任务:VibeThinker的设计哲学解读

专注于高强度推理任务&#xff1a;VibeThinker的设计哲学解读 在当前大模型“军备竞赛”愈演愈烈的背景下&#xff0c;百亿、千亿参数已成为主流标配&#xff0c;训练动辄消耗数百万美元&#xff0c;部署依赖高端GPU集群。然而&#xff0c;在数学竞赛题求解、算法编程等需要严…

作者头像 李华
网站建设 2026/6/17 18:25:30

CSDN官网热门话题追踪:VibeThinker-1.5B为何成为开源新星?

VibeThinker-1.5B&#xff1a;小模型如何在高强度推理中逆袭&#xff1f; 在当前大模型“军备竞赛”愈演愈烈的背景下&#xff0c;参数规模动辄百亿千亿&#xff0c;训练成本动辄百万美元&#xff0c;似乎只有巨头才能玩得起AI这场游戏。然而&#xff0c;一个仅15亿参数、训练成…

作者头像 李华
网站建设 2026/6/17 20:09:42

FreeRTOS队列:入队与出队详解

一、基本概念入队&#xff08;Enqueue&#xff09;&#xff1a;向队列中添加数据&#xff08;发送消息&#xff09; 出队&#xff08;Dequeue&#xff09;&#xff1a;从队列中获取数据&#xff08;接收消息&#xff09;FreeRTOS队列采用FIFO&#xff08;先进先出&#xff09;机…

作者头像 李华
网站建设 2026/6/22 7:20:10

百考通AI数据分析助手,一键生成专业报告!

在数据驱动的时代&#xff0c;海量信息既是宝藏&#xff0c;也是负担。对于企业高管、市场分析师、科研人员乃至学生而言&#xff0c;如何从纷繁复杂的数据中提炼价值、洞察趋势、支撑决策&#xff0c;已成为一项核心竞争力。然而&#xff0c;面对堆积如山的Excel表格和CSV文件…

作者头像 李华