发布
社区首页 >问答首页 >Python ElementTree默认命名空间?

Python ElementTree默认命名空间?
EN

Stack Overflow用户
提问于 2015-12-01 07:33:54
回答 3查看 14.2K关注 0票数 24

有没有办法在python ElementTree中定义默认的/无前缀的名称空间?这似乎行不通..。

代码语言:javascript
代码运行次数:0
复制
ns = {"":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))

这也不是:

代码语言:javascript
代码运行次数:0
复制
ns = {None:"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))

这样做是正确的,但是我必须为每个元素添加前缀:

代码语言:javascript
代码运行次数:0
复制
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。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-03 07:46:28

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

代码语言:javascript
代码运行次数:0
复制
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使事情变得更简单:

代码语言:javascript
代码运行次数:0
复制
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"))
票数 27
EN

Stack Overflow用户

发布于 2020-06-16 07:26:47

Python3.8中的ElementTree允许使用空字符串作为前缀,因此您可以声明:

代码语言:javascript
代码运行次数:0
复制
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

票数 6
EN

Stack Overflow用户

发布于 2019-11-13 04:59:58

您可以使用以下命令检索默认名称空间:

代码语言:javascript
代码运行次数:0
复制
namespace = pom.getroot().tag.split("}")[0]+"}"

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

代码语言:javascript
代码运行次数:0
复制
print(pom.findall(namespace+"version"))

这不是一个优雅的解决方案,但它是有效的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34009992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档