Python ElementTree默认命名空间?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

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

答案

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

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

以上是关于Python ElementTree默认命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ElementTree 保存 XML 文件

[python小记]使用lxml修改xml文件,并遍历目录

cElementTree解析XML文件使用iterfind无法找到指定元素的问题

python010

python的XML处理模块ElementTree

python之路---10 *args **kwargs 命名空间 作用域 函数的嵌套