【发布时间】:2018-08-02 13:38:56
【问题描述】:
对于lxml,我不确定如何正确删除现有元素的命名空间并设置一个新元素。
例如,我正在解析这个最小的 xml 文件:
<myroot xmlns="http://myxml.com/somevalue">
<child1>blabla</child1>
<child2>blablabla</child2>
</myroot>
...我希望它变成:
<myroot xmlns="http://myxml.com/newvalue">
<child1>blabla/child1>
<child2>blablabla</child2>
</myroot>
与lxml:
from lxml import etree as ET
tree = ET.parse('myfile.xml')
root= tree.getroot()
如果我检查root:
In [7]: root
Out[7]: <Element {http://myxml.com/somevalue}myroot at 0x7f6e13832588>
In [8]: root.nsmap
Out[8]: {None: 'http://myxml.com/somevalue'}
In [11]: root.tag
Out[11]: '{http://myxml.com/somevalue}myroot'
理想情况下,我希望得到:
In [8]: root.nsmap
Out[8]: {None: 'http://myxml.com/newvalue'}
In [11]: root.tag
Out[11]: '{http://myxml.com/newvalue}myroot'
至于标签,只需设置正确的字符串即可。 nsmap呢?
【问题讨论】:
-
查看我的这个答案:stackoverflow.com/a/20956523/407651。它的得分为 -2,但它提供了我认为更改命名空间的最简单方法。
-
这是一个简单案例的解决方法,但恐怕它没有提供问题的答案
-
是的,这是一种解决方法。不幸的是,我不知道有什么更好的。操作命名空间可能非常困难。更新
nsmap无效。请参阅bugs.launchpad.net/lxml/+bug/555602(在链接答案的评论中提到了这个问题)。另见stackoverflow.com/a/31870245/407651。 -
我明白了。似乎不可思议的是,Python 的标准库中没有这么简单的东西......在
xml.etree.ElementTree中,我可以通过从标记值中删除{*}来删除所有命名空间,然后在所需元素上使用.set('xmlns', 'someURI')重置它们。使用lxml,会产生带有两个xmlns标签的元素:原始标签和新标签。我很失望...... -
@mzjn ... 否决票可能是由于将 XML 视为文本文件而不使用正确的 DOM 库方法。
标签: python xml lxml xml-namespaces elementtree