如何从python中的xmlNode获取xpathContext

2024-04-27 13:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

是.net上xpath和python中sax的忠实粉丝,但首次在python中使用xpath。在

我有一个小脚本,它使用xpath从文档中选择一些节点,遍历它们,然后理想情况下再次使用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()位失败

^{pr2}$

有什么办法在xmlNode上使用xpath吗?我找不到任何好的在线信息。 谢谢


Tags: importdocneturllibitemxpathsaxlibxml2
2条回答

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

也就是说,我没有直接使用libxml2,所以这是一个有点疯狂的猜测。我通常使用lxml,它公开libxml2和libxslt的elementtreeapi。它更易于使用,并且确实允许在元素上使用xpath()。当然,如果已经有很多使用libxml2的代码,您可能不想切换,但是在这种情况下,您可能需要查看lxmls源代码,看看它是如何做到的。在

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

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

似乎是个不错的起点。在

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)版本中,我们甚至可以调用:

^{pr2}$

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

相关问题 更多 >