2009-07-05 57 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表達式.//(而不是//)的開頭添加一個點,否則您將獲得相對於文檔根目錄的搜索結果。