Python XML 处理:xml.etree、lxml、xpath 实战
Introduction
XML 仍然是很多系统和配置文件的标准格式。本文讲解 Python 标准库 xml.etree 的用法、xpath 查询、XML 解析与生成、以及 lxml 库对大文件的处理和命名空间处理。
---
xml.etree.ElementTree 标准库
import xml.etree.ElementTree as ET
# 解析 XML 字符串
xml_str = '''<?xml version="1.0"?>
<users>
<user id="1">
<name>张三</name>
<email>zhangsan@example.com</email>
</user>
<user id="2">
<name>李四</name>
<email>lisi@example.com</email>
</user>
</users>'''
root = ET.fromstring(xml_str)
print(root.tag) # users
# 遍历所有 user
for user in root.findall('user'):
uid = user.get('id')
name = user.find('name').text
email = user.find('email').text
print(f"ID={uid}: {name} <{email}>")
# xpath 查询
admin = root.find("./user[@id='1']")
print(admin.find('name').text)
# 查找所有 email 元素
emails = root.findall('.//email')
for e in emails:
print(e.text)
生成 XML
import xml.etree.ElementTree as ET
from xml.dom import minidom
root = ET.Element('catalog')
book = ET.SubElement(root, 'book', id='1')
ET.SubElement(book, 'title').text = 'Python 入门'
ET.SubElement(book, 'author').text = '张三'
ET.SubElement(book, 'price').text = '59.00'
# 格式化输出
def prettify(elem):
rough = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough)
return reparsed.toprettyxml(indent=" ")
print(prettify(root))
# 保存到文件
tree = ET.ElementTree(root)
tree.write('catalog.xml', encoding='utf-8', xml_declaration=True)
lxml(更强大的 xpath)
pip install lxml
from lxml import etree
xml_doc = '''<catalog>
<book id="1"><title lang="zh">Python</title><price>59</price></book>
<book id="2"><title lang="en">JavaScript</title><price>69</price></book>
</catalog>'''
root = etree.fromstring(xml_doc.encode())
# xpath 查询
titles = root.xpath('//book/title/text()')
print(titles) # ['Python', 'JavaScript']
zh_books = root.xpath('//book[title/@lang="zh"]')
for book in zh_books:
print(etree.tostring(book, encoding='unicode'))
# 命名空间处理
ns = {'xs': 'http://www.w3.org/2001/XMLSchema'}
# 按实际命名空间使用
常见问题
Q1: XML 和 JSON 怎么选?结构化配置用 JSON,文档型/复杂层级用 XML,企业系统互相集成常用 XML(SOAP、RSS、Office 格式)。
Q2: XML 解析性能低怎么办?用 lxml 的 iterparse 逐行解析大文件:for event, elem in etree.iterparse('big.xml', events=('end',)): process(elem); elem.clear()。
Q3: 中文字符乱码?确保文件以 UTF-8 保存,XML 声明加 encoding="utf-8",python xml 时指定 encoding='utf-8'。
延伸阅读
- lxml xpath 高级用法
- XML Schema 验证
- Python Office 文档处理(OOXML)
---
作者:小马 | 绍大技术网 shaoda.net