Python lxml:如何在XML头部插入指定命名空间?
解决lxml/etree生成XML时命名空间位置与前缀不符的问题
你遇到的问题其实是因为register_namespace只是映射前缀和命名空间URI,但如果元素没有正确关联到对应命名空间、根节点也没显式声明所有需要的命名空间,就会出现命名空间被自动移到子节点、前缀乱变的情况。下面是具体的解决步骤:
核心思路
要让所有命名空间声明都出现在根节点上,同时指定正确的前缀,需要:
- 确保每个元素都绑定到对应的命名空间URI,而非随便用前缀字符串;
- 在创建根节点时显式声明所有需要的命名空间(包括默认命名空间);
- 避免etree自动生成
ns0这类随机前缀。
具体实现代码
import xml.etree.ElementTree as etree # 注册前缀与命名空间URI的映射,避免tostring输出随机前缀 etree.register_namespace('ns2', 'http://someotherurl') etree.register_namespace('ns3', 'http://another_someotherurl') # 创建根节点:用{命名空间URI}标签名的格式绑定到ns2的命名空间,同时显式声明所有命名空间 root = etree.Element( '{http://someotherurl}prenosPodatkovRazporedaOdgovorSporocilo', xmlns='http://someurl', # 声明默认命名空间 **{'xmlns:ns2': 'http://someotherurl', 'xmlns:ns3': 'http://another_someotherurl'} ) # 创建statusPrenosa子元素,绑定到ns2的命名空间 status_prenosa = etree.SubElement(root, '{http://someotherurl}statusPrenosa') # 创建默认命名空间下的子元素 status = etree.SubElement(status_prenosa, '{http://someurl}status') status.text = '09' naziv_statusa = etree.SubElement(status_prenosa, '{http://someurl}nazivStatusa') naziv_statusa.text = 'Napaka prenosa' # 生成XML字符串,指定编码和XML声明 xml_str = etree.tostring(root, encoding='UTF-8', xml_declaration=True, method='xml') print(xml_str.decode('UTF-8'))
为什么之前的方法无效?
你之前只做了命名空间注册,但没有把元素和对应的命名空间URI绑定——只是用了ns2:podatkiRazporeda这种前缀字符串,etree会把这种未绑定URI的前缀当成普通文本,自动生成新的混乱命名空间声明(比如xmlns:ns0="ns2"),这就是你看到异常结果的原因。
内容的提问来源于stack exchange,提问作者Yebach
相关产品推荐
相关产品推荐

