問題描述
有沒有辦法在 python ElementTree 中定義默認(rèn)/無前綴命名空間?這似乎不起作用...
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))
確實(shí)如此,但我必須為每個(gè)元素添加前綴:
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.
如果答案是否",您仍然可以獲得賞金 :-).我只是想從一個(gè)花了很多時(shí)間使用它的人那里得到一個(gè)明確的不".
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+,請參閱 這個(gè)答案.
NOTE: for Python 3.8+ please see this answer.
沒有直接的方法可以透明地處理默認(rèn)命名空間.正如您已經(jīng)提到的,為空命名空間分配一個(gè)非空名稱是一種常見的解決方案:
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 輸入數(shù)據(jù)時(shí)刪除默認(rèn)命名空間定義:
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"))
這篇關(guān)于Python ElementTree 默認(rèn)命名空間?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!