Python ElementTree default namespace?(Python ElementTree 默认命名空间?)
问题描述
有没有办法在 python ElementTree 中定义默认/无前缀命名空间?这似乎不起作用...
Is there a way to define the default/unprefixed namespace in python ElementTree? This doesn't seem to work...
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))
确实如此,但我必须为每个元素添加前缀:
This does, but then I have to prefix every element:
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.
Using Python 3.5 on OSX.
如果答案是否",您仍然可以获得赏金 :-).我只是想从一个花了很多时间使用它的人那里得到一个明确的不".
if the answer is "no", you can still get the bounty :-). I just want a definitive "no" from someone who's spent a lot of time using it.
推荐答案
注意:对于 Python 3.8+,请参阅 这个答案.
NOTE: for Python 3.8+ please see this answer.
没有直接的方法可以透明地处理默认命名空间.正如您已经提到的,为空命名空间分配一个非空名称是一种常见的解决方案:
There is no straight-forward way to handle the default namespaces transparently. Assigning the empty namespace a non-empty name is a common solution, as you've already mentioned:
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 不允许显式使用空命名空间.你会得到:
Note that lxml.etree does not allow the use of empty namespaces explicitly. You would get:
ValueError:ElementPath 中不支持空的命名空间前缀
ValueError: empty namespace prefix is not supported in ElementPath
您可以通过 在加载 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 默认命名空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python ElementTree 默认命名空间?
基础教程推荐
- Discord.py 缺少必需的参数 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
