如何用Python的ElementTree为XML元素添加默认命名空间及URN
给ElementTree生成的XML添加默认命名空间与urn命名空间声明的修改方案
直接说核心修改点,按步骤来:
第一步:提前定义命名空间URI
先把你的mam默认命名空间、urn命名空间的实际URI定义好(替换成你需要的真实地址):# mam默认命名空间的URI MAM_NS = "http://your-mam-namespace-url.com" # urn命名空间的URI URN_NS = "urn:your-urn-namespace-identifier"第二步:创建根元素时指定默认命名空间
原来创建根元素可能是root = ET.Element("root"),现在要给标签加上默认命名空间的Clark Notation(大括号包裹URI):# 根元素自动带上默认mam命名空间 root = ET.Element(f"{{{MAM_NS}}}root")第三步:给根元素添加urn命名空间前缀声明
通过set()方法给根元素添加urn的命名空间属性:# 声明urn前缀对应的命名空间 root.set("xmlns:urn", URN_NS)第四步:所有子元素都使用默认命名空间
不管是用ET.SubElement还是ET.Element创建子元素,都要带上默认命名空间的前缀,比如:# 创建带默认mam命名空间的子元素 child = ET.SubElement(root, f"{{{MAM_NS}}}item") sub_child = ET.Element(f"{{{MAM_NS}}}detail") child.append(sub_child)完整示例代码
下面是修改后的可运行代码,对比就能看到差异:import xml.etree.ElementTree as ET # 1. 定义命名空间 MAM_NS = "http://example.com/mam" URN_NS = "urn:example:urn-ns" # 2. 创建带默认命名空间的根元素 root = ET.Element(f"{{{MAM_NS}}}root") # 3. 添加urn命名空间声明 root.set("xmlns:urn", URN_NS) # 4. 创建所有带默认命名空间的子元素 item = ET.SubElement(root, f"{{{MAM_NS}}}item") item.set(f"{{{URN_NS}}}id", "123") # 使用urn命名空间的属性 item.text = "sample content" # 格式化并输出XML ET.indent(root) print(ET.tostring(root, encoding="utf-8").decode())生成的XML结构会是这样:
<root xmlns="http://example.com/mam" xmlns:urn="urn:example:urn-ns"> <item urn:id="123">sample content</item> </root>
注意事项:
- ElementTree遵循Clark Notation处理命名空间,必须用
{namespaceURI}tagname的格式来标记带命名空间的元素/属性。 - 如果要创建urn前缀的元素(比如
<urn:custom-tag>),直接用ET.SubElement(root, f"{{{URN_NS}}}custom-tag")即可,根元素的xmlns:urn声明会自动让输出显示urn:前缀。
内容的提问来源于stack exchange,提问作者user2811144
相关产品推荐
相关产品推荐

