如何从python中的xmlNode获取xpathContext
Posted
技术标签:
【中文标题】如何从python中的xmlNode获取xpathContext【英文标题】:How to get an xpathContext from an xmlNode in python 【发布时间】:2009-07-05 13:27:21 【问题描述】:.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()
位失败并显示
itemctxt = item.xpathNewContext()
AttributeError: xmlNode instance has no attribute 'xpathNewContext'
关于如何在 xmlNode 上使用 xpath 有什么想法吗?我找不到任何好的在线信息。 谢谢
【问题讨论】:
【参考方案1】:我认为 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
似乎是不错的起点。
【讨论】:
嗯,我在使用 lxml 时遇到了类似的问题,但事实证明问题实际上与 xpath 如何处理命名空间有关。 lxml 的 ElementPath 简化了一些事情。谢谢。 如果有人想看看我最终得到了什么,请查看bitbucket.org/kurthaeusler/getwishlist/src/tip/getwishlist.py【参考方案2】:https://***.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 表达式的开头添加一个点 .//
(而不是 //
),否则您将获得相对于文档根目录的搜索结果。
【讨论】:
以上是关于如何从python中的xmlNode获取xpathContext的主要内容,如果未能解决你的问题,请参考以下文章
C# 中 XmlNode.SelectSingleNode(string xpath) 的正确用法是啥?
Web 服务返回的 XmlDocument 作为 XmlNode,那么 XPath 不起作用?