简短版: 如何添加xmlns:xi =" http://www.w3.org/2001/XInclude"使用lxml在python中使用前缀decleration到我的根元素?
上下文:
我有一些XML文件,其中包含其他文件的ID。
这些ID代表引用的文件名。
使用lxml我设法用适当的XInclude语句替换它们,但如果我没有前缀decleration,我的XML解析器不会添加包含,这是正常的。
编辑: 我不会包含我的代码,因为它无助于理解问题。我可以很好地处理文档,我的问题是序列化。
所以从此
<root>
<somechild/>
</root>
我想在输出文件中获取此<root xmlns:xi="http://www.w3.org/2001/XInclude">
<somechild/>
</root>
。
为此,我尝试使用
`
tree = ET.parse(fileName)
root = tree.getroot()
root.nsmap['xi'] = "http://www.w3.org/2001/XInclude"
tree.write('output.xml', xml_declaration=True, encoding="UTF-8", pretty_print=True)
`
答案 0 :(得分:2)
属性nsmap
不可写在我尝试您的代码时出现错误。
您可以尝试注册命名空间,删除根元素的当前属性(保存后),使用set()
方法添加命名空间并恢复属性。
一个例子:
>>> root = etree.XML('<root a1="one" a2="two"> <somechild/> </root>')
>>> etree.register_namespace('xi', 'http://www.w3.org/2001/XInclude')
>>> etree.tostring(root)
b'<root a1="one" a2="two"> <somechild/> </root>'
>>> orig_attrib = dict(root.attrib)
>>> root.set('{http://www.w3.org/2001/XInclude}xi', '')
>>> for a in root.attrib: del root.attrib[a]
>>> for a in orig_attrib: root.attrib[a] = orig_attrib[a]
>>> etree.tostring(root)
b'<root xmlns:xi="http://www.w3.org/2001/XInclude" a1="one" a2="two"> <somechild/> </root>'
>>> root.nsmap
{'xi': 'http://www.w3.org/2001/XInclude'}