news 2026/4/18 5:22:16

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/4/18 0:51:28

图形推理局限性说明:当前无法处理图像类输入内容

VibeThinker-1.5B-APP&#xff1a;小模型的高阶推理实践与图形输入局限性解析 在当前大模型“军备竞赛”愈演愈烈的背景下&#xff0c;动辄千亿参数、千卡集群训练似乎成了AI能力的代名词。然而&#xff0c;资源消耗的背后也暴露出一个问题&#xff1a;我们是否真的需要如此庞大…

作者头像 李华
网站建设 2026/4/17 15:47:30

无需GPT-4级别算力!VibeThinker以低成本完成复杂算法推理

无需GPT-4级别算力&#xff01;VibeThinker以低成本完成复杂算法推理 在编程竞赛圈&#xff0c;一个令人难以忽视的事实是&#xff1a;越来越多的顶尖选手开始借助AI辅助解题。但主流大模型动辄需要数万美元的推理成本、依赖云端API调用&#xff0c;这让许多学生和独立开发者望…

作者头像 李华
网站建设 2026/4/18 0:28:41

符号识别能力检验:VibeThinker对LaTeX公式的解析水平

VibeThinker-1.5B&#xff1a;小模型如何精准解析LaTeX数学公式&#xff1f; 在数学竞赛的深夜训练中&#xff0c;一个高中生面对一道复杂的积分题卡住了——$\int x \cos x\,dx$。他没有翻教科书&#xff0c;也没有求助老师&#xff0c;而是打开本地部署的一个轻量AI模型界面&…

作者头像 李华
网站建设 2026/4/16 15:49:47

上下文长度限制应对策略:分段输入长篇数学命题的方法

上下文长度限制应对策略&#xff1a;分段输入长篇数学命题的方法 在当前的AI推理应用中&#xff0c;一个现实而棘手的问题逐渐浮现&#xff1a;即便模型具备强大的逻辑推导能力&#xff0c;其“阅读视野”却受限于上下文窗口大小。当面对一道完整的数学竞赛题——尤其是包含多个…

作者头像 李华
网站建设 2026/4/16 13:04:10

我国城市轨道交通视频监控系统发展现状、挑战与趋势研究

目录 1 发展历程与总体现状&#xff1a;从“单一录像”到“全域感知” 2 关键技术特征与标准体系 3 典型应用场景与实践案例 4 面临的挑战与发展趋势 5 结论 城市轨道交通作为现代都市的“主动脉”&#xff0c;其安全、高效运营直接关系到城市的正常运转和人民群众的生命财…

作者头像 李华