2009-07-05 58 views
2

.NET中的xpath的巨大粉丝,以及python中的sax,但第一次在python中使用xpath。如何从python中的xmlNode获取xpathContext

我有一个小脚本,它使用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()位失败,

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

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

回答

2

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

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

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

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

似乎不错首发名额。

+0

那么我有类似的问题与lxml,但事实证明,这个问题实际上与xpath如何处理名称空间有关。 lxml的ElementPath简化了一些东西。谢谢。 – Kurt 2009-07-05 15:25:55

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

在蟒蛇的libxml的版本(2.9.1),事实证明,甚至可以拨打:

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

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