如何从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) 的正确用法是啥?

尝试选择 Word 文档中的所有 XMLNode

Web 服务返回的 XmlDocument 作为 XmlNode,那么 XPath 不起作用?

当 XPath 验证器返回正确结果时,为啥 XmlNode.SelectNodes 返回空列表?

如何获取一个节点的所有直接子节点的集合?

按属性搜索 XmlNode