Python ElementTree默认名称空间? [英] Python ElementTree default namespace?

查看:267
本文介绍了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.

推荐答案

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

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默认名称空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆