Python ElementTree 默认命名空间?
Python ElementTree default namespace?
有没有办法在 python ElementTree 中定义 default/unprefixed 命名空间?这似乎不起作用...
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。
编辑:如果答案是 "no",您仍然可以获得赏金 :-)。我只想要一个已经花了很多时间使用它的人的明确 "no"。
注意:对于 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
: empty namespace prefix is not supported in ElementPath
不过,您可以通过 removing the default namespace definition 在加载 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"))
您可以使用以下方法检索默认命名空间:
namespace = pom.getroot().tag.split("}")[0]+"}"
然后当您搜索元素时,将其添加到您的搜索路径中:
print(pom.findall(namespace+"version"))
这不是一个优雅的解决方案,但它确实有效。
ElementTree in Python 3.8 允许空字符串作为前缀,所以你可以声明:
ns = {'': 'http://maven.apache.org/POM/4.0.0'}
并将其用作 find*
方法中的第二个参数。
有没有办法在 python ElementTree 中定义 default/unprefixed 命名空间?这似乎不起作用...
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。
编辑:如果答案是 "no",您仍然可以获得赏金 :-)。我只想要一个已经花了很多时间使用它的人的明确 "no"。
注意:对于 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
: empty namespace prefix is not supported in ElementPath
不过,您可以通过 removing the default namespace definition 在加载 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"))
您可以使用以下方法检索默认命名空间:
namespace = pom.getroot().tag.split("}")[0]+"}"
然后当您搜索元素时,将其添加到您的搜索路径中:
print(pom.findall(namespace+"version"))
这不是一个优雅的解决方案,但它确实有效。
ElementTree in Python 3.8 允许空字符串作为前缀,所以你可以声明:
ns = {'': 'http://maven.apache.org/POM/4.0.0'}
并将其用作 find*
方法中的第二个参数。