上一篇
Python XML数据处理入门教程 - 解析、生成与操作XML
- Python
- 2025-08-08
- 1050
Python XML数据处理完全指南
掌握XML解析、生成与操作的核心技术
什么是XML数据?
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它被设计成具有自我描述性,使用标签定义数据结构。XML广泛应用于配置文件、Web服务、数据交换等场景。
XML主要特点:
- 可扩展性:允许用户定义自己的标签
- 平台无关:可在不同系统间交换数据
- 结构化:清晰地表示数据层次关系
- 纯文本格式:人类可读且机器可解析
Python处理XML的核心库
ElementTree
Python标准库的一部分,简单高效,是处理XML的首选工具。
优点:内存占用小,API简洁,支持XPath查询
minidom
文档对象模型(DOM)的轻量级实现,适合小型XML文档。
优点:符合W3C DOM规范,支持完整的DOM操作
第三方库
lxml:功能强大,性能优异,支持XSLT和XPath
xmltodict:将XML转换为Python字典
使用ElementTree解析XML
示例XML文档 (books.xml):
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>王伟</author>
<title>Python编程入门</title>
<price>49.99</price>
</book>
<book id="bk102">
<author>张丽</author>
<title>XML数据处理实战</title>
<price>55.50</price>
</book>
</catalog>
Python解析代码:
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('books.xml')
root = tree.getroot()
# 遍历所有book元素
print("图书目录:")
for book in root.findall('book'):
book_id = book.get('id')
author = book.find('author').text
title = book.find('title').text
price = book.find('price').text
print(f"ID: {book_id}")
print(f"标题: {title}")
print(f"作者: {author}")
print(f"价格: {price}元")
print("-" * 30)
代码输出结果:
图书目录: ID: bk101 标题: Python编程入门 作者: 王伟 价格: 49.99元 ------------------------------ ID: bk102 标题: XML数据处理实战 作者: 张丽 价格: 55.50元 ------------------------------
使用ElementTree生成XML
Python创建XML文档:
import xml.etree.ElementTree as ET
# 创建根元素
root = ET.Element("catalog")
# 创建第一个book元素
book1 = ET.SubElement(root, "book")
book1.set("id", "bk201")
ET.SubElement(book1, "author").text = "李强"
ET.SubElement(book1, "title").text = "Python高级编程"
ET.SubElement(book1, "price").text = "79.99"
# 创建第二个book元素
book2 = ET.SubElement(root, "book")
book2.set("id", "bk202")
ET.SubElement(book2, "author").text = "刘芳"
ET.SubElement(book2, "title").text = "XML与Web服务"
ET.SubElement(book2, "price").text = "65.00"
# 创建ElementTree对象
tree = ET.ElementTree(root)
# 写入文件(格式化输出)
ET.indent(tree, space=" ", level=0)
tree.write("new_books.xml", encoding="utf-8", xml_declaration=True)
生成的XML文件 (new_books.xml):
<?xml version='1.0' encoding='utf-8'?>
<catalog>
<book id="bk201">
<author>李强</author>
<title>Python高级编程</title>
<price>79.99</price>
</book>
<book id="bk202">
<author>刘芳</author>
<title>XML与Web服务</title>
<price>65.00</price>
</book>
</catalog>
XML数据操作与修改
修改XML内容:
import xml.etree.ElementTree as ET
tree = ET.parse('books.xml')
root = tree.getroot()
# 更新第一本书的价格
for book in root.findall('book'):
if book.get('id') == 'bk101':
price_elem = book.find('price')
# 将价格提高10%
new_price = float(price_elem.text) * 1.1
price_elem.text = f"{new_price:.2f}"
# 添加折扣属性
book.set('discount', '10%')
# 添加新书
new_book = ET.SubElement(root, "book")
new_book.set("id", "bk103")
ET.SubElement(new_book, "author").text = "陈明"
ET.SubElement(new_book, "title").text = "Python数据分析"
ET.SubElement(new_book, "price").text = "89.90"
# 保存修改
tree.write('updated_books.xml', encoding='utf-8', xml_declaration=True)
常用XML操作:
- 查找元素:find(), findall(), iter()
- 获取属性:element.get('attribute_name')
- 修改文本:element.text = "new value"
- 添加元素:ET.SubElement(parent, 'tag')
- 删除元素:parent.remove(child)
- 设置属性:element.set('attr', 'value')
XPath查询示例:
# 查找所有价格大于50的书
expensive_books = root.findall(".//book[price>50]")
# 查找特定作者的书
author_books = root.findall(".//book[author='张丽']")
# 获取所有标题
titles = [book.find('title').text for book in root.findall('book')]
XML处理最佳实践
安全注意事项
- 当心XML炸弹:限制解析深度和元素数量
- 验证输入:只处理可信来源的XML数据
- 使用defusedxml库防止XML攻击
- 禁用外部实体引用(XXE漏洞)
性能优化
- 大型XML:使用iterparse()进行增量解析
- 内存敏感:选择ElementTree而非DOM
- 复杂需求:考虑lxml库提高性能
- 只读操作:使用iter()而非findall()
命名空间处理
- 注册命名空间前缀
ET.register_namespace('ns', 'http://example.com')
root.findall('ns:element',
{'ns': 'http://example.com'})
Python XML处理知识总结
- ElementTree是Python处理XML的首选标准库
- 掌握解析、生成和修改XML的基本操作
- 使用XPath可以高效查询XML文档
- 注意XML处理的安全性和性能问题
- 对于复杂需求,考虑使用lxml等第三方库
通过本教程,您已经掌握了Python处理XML数据的核心技能。XML作为通用的数据交换格式,在配置文件、Web服务和数据存储等场景中广泛应用。现在就开始使用Python处理您的XML数据吧!
本文由QiuMin于2025-08-08发表在吾爱品聚,如有疑问,请联系我们。
本文链接:http://pjw.521pj.cn/20257602.html
发表评论