Python XML 处理:xml.etree、lxml、xpath 实战

小飞兽 Python 9 次阅读 2026-07-24

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