2010-11-29 7 views
3

このサンプルXMLファイルを使用して、PythonからXPathクエリを実行する方法を学習しようとしています。http://pastie.org/1333021実際のアプリケーションで使用されているため、名前空間を追加しました。Python libxml2 XPath/Namespace Help

基本的に、私はこれが最初にすべての<food>のノードを見つけるために私のコードです(この例よりもはるかに大きな規模で)

をノードのサブセットを返します。トップレベルのクエリを実行して、サブセットを照会したいですそれぞれの説明を繰り返します。

#!/usr/bin/python2 

import libxml2 

doc = libxml2.parseFile("simple.xml") 
context = doc.xpathNewContext() 

context.xpathRegisterNs("db", "http://examplenamespace.com") 
res = context.xpathEval("//db:food") 

for node in res: 
    # Query xmlNode here 
    print "Got Food Node:" 
    desc = node.xpathEval('db:description') # this is wrong? 
    print desc 

だから、私は、XMLファイルからxlns属性を削除し、db:せずにただ基本的なXPathクエリを使用している場合、それは正常に動作し、基本的に名前空間の問題です。先頭のクエリ//db:foodはうまく動作しますが、2番目のクエリは評価に失敗します。

私の名前空間/クエリの構文を修正できますか?私は通常のlibxml2を使用していない

どうもありがとう

答えて

5

は、私がずっとlxml.etreeを好みます。

遊びがありました。ノード上のxpathEvalメソッドは、毎回新しいコンテキストを作成します。登録された名前空間はありません。

次のような別の場所にあなたのコンテキストをリセットすることができます。

>>> import libxml2 
>>> from urllib2 import urlopen 
>>> data = urlopen('http://pastie.org/pastes/1333021/download').read() 
>>> 
>>> doc = libxml2.parseMemory(data,len(data)) 
>>> 
>>> context = doc.xpathNewContext() 
>>> context.xpathRegisterNs("db", "http://examplenamespace.com") 
0 
>>> 
>>> for res in context.xpathEval("//db:food"): 
...  context.setContextNode(res) 
...  print "Got Food Node:" 
...  desc = context.xpathEval('./db:description')[0] 
...  print desc 
... 
Got Food Node: 
<description>two of our famous Belgian Waffles with plenty of real maple syrup</description> 
Got Food Node: 
<description>light Belgian waffles covered with strawberries and whipped cream</description> 
Got Food Node: 
<description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description> 
Got Food Node: 
<description>thick slices made from our homemade sourdough bread</description> 
Got Food Node: 
<description>two eggs, bacon or sausage, toast, and our ever-popular hash browns</description> 
+0

おかげで非常に多く、私は私が変わる状況に混乱していたと思います:) – Jason