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() 释放内存。