生成复杂嵌套XML的关键是将结构视为“树形对象图”,支持边建边挂载或先建后拼接;SubElement递进创建适合浅层结构,字典+递归适合深层动态场景,并可处理命名空间、注释等扩展需求。

理解ElementTree的嵌套逻辑
生成复杂嵌套XML的关键不是层层调用SubElement,而是把XML结构看作“树形对象图”:每个元素是可持有子元素的容器,子元素可继续添加子元素。ElementTree不强制一次性构建,支持边建边挂载,也支持先建好再拼接。
用SubElement递进创建多层结构
这是最直观的方式,适合结构明确、层级较浅(如4层以内)的场景。每一步都返回新创建的子元素,可立即在其上继续添加:
- 用
ET.Element("root")创建根节点 - 对每个子节点,调用
ET.SubElement(父节点, "标签名", attrib={...}) - 返回值就是该子节点,可链式调用或赋值后复用
- 文本内容通过
.text = "值"设置,尾部空白用.tail(一般不用)
例如生成带属性和文本的三层结构:
import xml.etree.ElementTree as ETroot = ET.Element("company", name="TechCorp") dept = ET.SubElement(root, "department", id="d1") emp = ET.SubElement(dept, "employee", status="active") emp.text = "Alice" ET.SubElement(emp, "role").text = "Engineer" ET.SubElement(emp, "salary").text = "95000"
输出美化后的XML
ET.indent(root) # Python 3.9+ 支持,需手动启用缩进 print(ET.tostring(root, encoding="unicode"))
用字典+递归批量生成深层嵌套
当XML结构来自配置、数据库或API响应时,用嵌套字典描述更清晰。写一个递归函数,把字典自动转为ElementTree节点:
立即学习“Python免费学习笔记(深入)”;
- 字典键为标签名,值为另一个字典(含
"_attrs"、"_text"、"_children"等约定字段) - 遇到
"_children"列表就递归调用,逐个追加到当前元素 - 支持混合文本与子元素(即
elem.text设为字符串,同时有子节点)
示例字典结构:
data = {
"report": {
"_attrs": {"version": "2.1"},
"_children": [
{
"header": {
"_text": "Q3 Financial Summary",
"_attrs": {"lang": "en"}
}
},
{
"body": {
"_children": [
{"section": {"_text": "Revenue", "_attrs": {"id": "s1"}}},
{"section": {"_text": "Expenses", "_attrs": {"id": "s2"}}}
]
}
}
]
}
}
处理特殊需求:命名空间、CDATA、注释
ElementTree默认不支持CDATA,需绕过或改用lxml;但命名空间和注释原生可用:
- 命名空间在创建根元素时传入
nsmap(仅lxml支持)或用前缀声明,如ET.Element("{http://example.com/ns}root") - 添加注释:
ET.Comment("Generated on 2024-06-15"),然后用root.append(comment) - CDATA需手动字符串拼接(不推荐),或切换至
lxml.etree,用etree.CDATA("...")包裹文本 - 避免非法字符:ElementTree会自动转义
、&等,无需手动处理










