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

Nor does this:

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

Using Python 3.5 on OSX.

EDIT: 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))

Note that lxml.etree does not allow the use of empty namespaces explicitly. You would get:

ValueError: empty namespace prefix is not supported in ElementPath

You can though, make things simpler, by removing the default namespace definition while loading the XML input data:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值