如何用ElementTree复制含命名空间及属性的指定XML根元素?
搞定XML命名空间与根元素生成问题
嘿,我来帮你解决这个XML生成的问题!你现在的代码之所以输出不符合预期,主要是三个小问题:命名空间前缀没注册正确、根元素名称写错了,还没添加上需求里的属性。下面是修正后的完整实现:
正确代码示例
import xml.etree.ElementTree as ET # 关键:注册命名空间时指定前缀为ns0,对应目标URI ET.register_namespace("ns0", "http://website.com/schemas/StdFX1.3.In") # 创建正确的根元素:命名空间URI + 元素名StdFX1.3 root = ET.Element('{http://website.com/schemas/StdFX1.3.In}StdFX1.3') # 给根元素添加需要的三个属性 root.set('CutOff', '2200LON') root.set('DataSource', '') root.set('SpotDataSource', '') # 生成并输出XML(两种方式可选) # 方式1:写入文件 tree = ET.ElementTree(root) ET.indent(tree) # 可选:让XML格式化带缩进,Python 3.9+支持 tree.write('output.xml', encoding='UTF-8', xml_declaration=True) # 方式2:直接打印XML字符串 import io output_buffer = io.BytesIO() tree.write(output_buffer, encoding='UTF-8', xml_declaration=True) print(output_buffer.getvalue().decode('UTF-8'))
代码细节解释
- 命名空间注册:之前你用空字符串作为前缀注册,所以输出时不会显示
ns0。现在明确指定ns0作为前缀,这样ElementTree生成XML时就会用这个前缀绑定对应URI。 - 根元素创建:元素名必须写成
{命名空间URI}StdFX1.3这种格式,让ElementTree识别它属于我们注册的ns0命名空间,而不是你之前写的Stuff。 - 属性添加:用
set()方法逐个添加需求里的CutOff、DataSource、SpotDataSource属性,值完全匹配你的要求。 - XML输出:指定
xml_declaration=True会生成完整的XML声明,encoding='UTF-8'确保编码正确,ET.indent()是Python 3.9+新增的方法,能让输出的XML更美观易读。
最终生成的XML
<?xml version='1.0' encoding='UTF-8'?> <ns0:StdFX1.3 xmlns:ns0="http://website.com/schemas/StdFX1.3.In" CutOff="2200LON" DataSource="" SpotDataSource=""/>
完美匹配你需要的XML结构啦!
内容的提问来源于stack exchange,提问作者gregV
相关产品推荐
相关产品推荐

