跳到主要内容

XML

Python 的 xml.etree.ElementTree 适合处理中小型 XML。XML 是树结构,由元素、属性、文本和命名空间组成。

解析文档​

import xml.etree.ElementTree as ET

root = ET.fromstring("""<users><user id="1">小林</user><user id="2">小周</user></users>""")
for user in root.findall("user"):
print(user.get("id"), user.text)

从文件解析使用 ET.parse("users.xml"),再通过 .getroot() 获取根元素。find 返回第一个匹配,findall 返回匹配列表,iter("user") 可递归搜索。

生成 XML​

root = ET.Element("users")
user = ET.SubElement(root, "user", {"id": "1"})
user.text = "小林"
tree = ET.ElementTree(root)
ET.indent(tree, space=" ") # Python 3.9+
tree.write("users.xml", encoding="utf-8", xml_declaration=True)

属性值应通过 API 设置,不要手工拼接 XML 字符串,否则容易产生转义错误。ET.tostring(root, encoding="unicode") 可获得字符串。

命名空间​

xml = '<doc xmlns="urn:demo"><item>1</item></doc>'
root = ET.fromstring(xml)
ns = {"d": "urn:demo"}
print(root.find("d:item", ns).text)

默认命名空间也必须在查询中提供。带前缀的文档需把前缀映射到完整 URI。

安全与大文件​

不要使用不受信任 XML 的通用解析器配置;实体扩展可能造成资源消耗或数据泄露。处理外部输入时优先使用 defusedxml(第三方库)。大文件使用 ET.iterparse() 流式处理,并在处理完元素后调用 element.clear() 释放内存。