Python ElementTree 默认命名空间?

标签 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。

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

最佳答案

注意:对于 Python 3.8+,请参阅 this answer .


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

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

关于Python ElementTree 默认命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009992/

相关文章:

java - 我们可以在 xml 中为 android 背景制作多色渐变吗?

python - 对列表中的 Python 字典对象进行排序

python - 检索对象时包括整个外键对象

python - 确定检测器系统中旋转正方形的重叠

python - 多次匹配任何字符,但在给定字符处停止

python - 获取带有属性的 etree 元素,或者包含带有属性的子元素

java - 无法在 Apache Jena 生成的 XML 中显示 UTF-8 编码

python - 使用 python_crontab 计划的作业不起作用

python - 训练好的 Keras 模型无法使用 load_model 加载

python - 在 Python 中从导入的文件运行代码