Python ElementTree默认命名空间?

时间:2015-11-30 23:33:54

标签: python xml python-3.x namespaces 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。

编辑:如果答案是“否”,你仍然可以获得赏金:-)。我只想要一个花了很多时间使用它的人的明确“不”。

3 个答案:

答案 0 :(得分:18)

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

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输入数据时,您可以通过removing the default namespace definition简化操作:

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"))

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您可以使用以下方法检索默认名称空间:

aws

然后,当您搜索元素时,将其添加到搜索路径:

namespace = pom.getroot().tag.split("}")[0]+"}"

这不是一个优雅的解决方案,但它可以工作。