如何从python中的xmlNode获取xpathContext

时间:2009-07-05 13:27:21

标签: python xpath xmlnode

.net上的xpath的大粉丝和python中的sax,但是第一次在python中使用xpath。

我有一个小脚本,它使用xpath从doc中选择一些节点,遍历它们,然后理想地再次使用xpath从中获取相关数据。但是我无法获得最后一点,一旦我拥有xmlNode,我无法从中获取上下文。

import libxml2
import urllib

doc = libxml2.parseDoc(
        urllib.urlopen('http://somemagicwebservice.com/').read())
ctxt = doc.xpathNewContext()
listitems = ctxt.xpathEval('//List/ListItem')
for item in listitems:
    itemctxt = item.xpathNewContext()
    title = itemctxt.xpathEval('//ItemAttributes/Title')
    asin = itemctxt.xpathEval('//Item/ASIN')
    itemctxc.xpathFreeContext()
ctxt.xpathFreeContext()
doc.freeDoc()

但是itemctxt = item.xpathNewContext()位失败并带有

itemctxt = item.xpathNewContext()
AttributeError: xmlNode instance has no attribute 'xpathNewContext'

如何在xmlNode上使用xpath?我找不到任何好的在线信息。 感谢

2 个答案:

答案 0 :(得分:2)

我不认为XPathContext对元素有意义吗?尝试创建一个新的XPathContext,并将其节点设置为当前元素。

那就是说,我没有直接使用libxml2,所以这是一个疯狂的猜测。我通常使用lxml,它在libxml2和libxslt周围公开了一个ElementTree API。它更容易使用,并且确实允许元素上的xpath()。当然,如果你已经有很多使用libxml2的代码,你可能不想切换,但在这种情况下,你可能想看看它是如何做到的。

http://codespeak.net/svn/lxml/trunk/src/lxml/xpath.pxi

http://codespeak.net/svn/lxml/trunk/src/lxml/_elementpath.py

似乎是个好的起点。

答案 1 :(得分:1)

https://stackoverflow.com/a/3379708/288875建议在新创建的上下文中调用setContextNode(..)

itemctxt = doc.xpathNewContext()

for item in listitems:
    itemctxt.setContextNode(item)
    title = itemctxt.xpathEval('.//ItemAttributes/Title')

    ...

itemctxt.xpathFreeContext()

在我正在使用的python libxml(2.9.1)版本中,结果发现人们甚至可以调用:

item.xpathEval('.//ItemAttributes/Title')

请注意,您必须在xpath表达式.//的开头添加一个点(而不是//),否则您将获得相对于文档根目录的搜索结果。