首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让lxml.objectify忽略xml命名空间?

让lxml.objectify忽略xml命名空间?
EN

Stack Overflow用户
提问于 2010-06-24 00:41:52
回答 2查看 3K关注 0票数 4

所以我要处理一些看起来像这样的xml:

代码语言:javascript
复制
<ns2:foobarResponse xmlns:ns2="http://api.example.com">
  <duration>206</duration>
  <artist>
    <tracks>...</tracks>
  </artist>
</ns2:foobarResponse>

我发现了lxml和它的objectify模块,它允许您以pythonic方式遍历xml文档,就像字典一样。

问题是:每当您尝试访问一个元素时,它都会使用伪造的xml名称空间,如下所示:

代码语言:javascript
复制
from lxml import objectify

tree = objectify.fromstring(xml)
print tree.artist
# ERROR: no such child: {http://api.example.com}artist

它试图使用父命名空间访问<artist>,但标记没有使用n。

有什么办法可以解决这个问题吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-24 01:51:09

根据lxml.objectify documentation,属性查找默认使用其父元素的名称空间。

你可能想要做的是:

代码语言:javascript
复制
print tree["{}artist"]

如果您的孩子有一个非空的名称空间(例如,“{http://foo/} QName”),像这样的艺术家语法就可以工作,但不幸的是,当前的源代码似乎将一个空的名称空间视为没有名称空间,所以objectify的所有查找好处将有助于用父名称空间替换空的名称空间,而您就不走运了。

这要么是一个bug ("{}artist“应该可以工作),要么是lxml人员对文件的增强请求。

目前,最好的做法可能是:

代码语言:javascript
复制
print tree.xpath("artist")

我不清楚在这里使用xpath会对性能造成多大的影响,但这肯定是有效的。

票数 7
EN

Stack Overflow用户

发布于 2012-08-28 22:03:19

仅供参考:请注意,从lxml2.3开始,这就是预期的工作方式。

在lxml changelog中:

“...

2.3 (2011-02-06)新增功能

  • 查找子项时,lxml.objectify将'{}tag‘视为空命名空间,而不是父级命名空间。

...“

在行动中:

代码语言:javascript
复制
>>> 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]
>>>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3103661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档