所以我要处理一些看起来像这样的xml:
<ns2:foobarResponse xmlns:ns2="http://api.example.com">
<duration>206</duration>
<artist>
<tracks>...</tracks>
</artist>
</ns2:foobarResponse>我发现了lxml和它的objectify模块,它允许您以pythonic方式遍历xml文档,就像字典一样。
问题是:每当您尝试访问一个元素时,它都会使用伪造的xml名称空间,如下所示:
from lxml import objectify
tree = objectify.fromstring(xml)
print tree.artist
# ERROR: no such child: {http://api.example.com}artist它试图使用父命名空间访问<artist>,但标记没有使用n。
有什么办法可以解决这个问题吗?谢谢
发布于 2010-06-24 01:51:09
根据lxml.objectify documentation,属性查找默认使用其父元素的名称空间。
你可能想要做的是:
print tree["{}artist"]如果您的孩子有一个非空的名称空间(例如,“{http://foo/} QName”),像这样的艺术家语法就可以工作,但不幸的是,当前的源代码似乎将一个空的名称空间视为没有名称空间,所以objectify的所有查找好处将有助于用父名称空间替换空的名称空间,而您就不走运了。
这要么是一个bug ("{}artist“应该可以工作),要么是lxml人员对文件的增强请求。
目前,最好的做法可能是:
print tree.xpath("artist")我不清楚在这里使用xpath会对性能造成多大的影响,但这肯定是有效的。
发布于 2012-08-28 22:03:19
仅供参考:请注意,从lxml2.3开始,这就是预期的工作方式。
在lxml changelog中:
“...
2.3 (2011-02-06)新增功能
...“
在行动中:
>>> xml = """<ns2:foobarResponse xmlns:ns2="http://api.example.com">
... <duration>206</duration>
... <artist>
... <tracks>...</tracks>
... </artist>
... </ns2:foobarResponse>"""
>>> tree = objectify.fromstring(xml)
>>> print tree['{}artist']
artist = None [ObjectifiedElement]
tracks = '...' [StringElement]
>>>https://stackoverflow.com/questions/3103661
复制相似问题