Python ElementTree 默认命名空间?

新手上路,请多包涵

有没有办法在 python ElementTree 中定义默认/无前缀的命名空间?这似乎不起作用…

 ns = {"":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))

这也不是:

 ns = {None:"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))

确实如此,但是我必须为每个元素添加前缀:

 ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))

在 OSX 上使用 Python 3.5。

编辑:如果答案是“否”,您仍然可以获得赏金:-)。我只想从花费大量时间使用它的人那里得到一个明确的“不”。

原文由 Robert Fraser 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 719
2 个回答

注意:对于 Python 3.8+,请参阅 此答案


没有直接的方法来透明地处理默认命名空间。正如您已经提到的,为空命名空间分配一个非空名称是一种常见的解决方案:

 ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))

请注意 lxml.etree 不允许明确使用空命名空间。你会得到:

ValueError : ElementPath 不支持空命名空间前缀


不过,您可以通过在加载 XML 输入数据时 删除默认命名空间定义来 简化事情:

 import xml.etree.ElementTree as ET
import re

with open("pom.xml") as f:
    xmlstring = f.read()

# Remove the default namespace definition (xmlns="http://some/namespace")
xmlstring = re.sub(r'\sxmlns="[^"]+"', '', xmlstring, count=1)

pom = ET.fromstring(xmlstring)
print(pom.findall("version"))

原文由 alecxe 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python 3.8 中的 ElementTree 允许空字符串作为前缀,因此您可以声明:

 ns = {'': 'http://maven.apache.org/POM/4.0.0'}

并将其用作 find* 方法中的第二个参数。

资料来源: https ://docs.python.org/3.8/library/xml.etree.elementtree.html?highlight=xml#xml.etree.ElementTree.Element.find

原文由 delocalizer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题