2011-01-01 13 views
4

は考える:特定の属性値を持つxml要素のデータを選択する方法は?

<foo> 
<bar key="true">text1</bar> 
<bar key="false">text2</bar> 
<bar key="true">text3</bar> 
<bar key="true">text4</bar> 
</foo> 

を私はキー属性は=「false」のバー要素のテキストを取得したいです。

私のアプリケーションは、GAEのPython 2.5.5です。 XMLはtrue xmlではありませんが、ElementTreeとしてロードしてデータを正常に取得できます。

コード例:

result = urllib2.urlopen(url).read() 
xml = ElementTree.fromstring(result) 
str = xml.find("./bar").attrib['key'] 

最初の値を取得します。私は動作するはずだと思う様々なxpathクエリを試しましたが、明らかに構文が間違っています。

UPDATE:

str = xml.findtext("./bar[@key='false']") 

がエラーを例外:

File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/xml/etree/ElementPath.py", line 93, in __init__ 
    "expected path separator (%s)" % (op or tag) 
SyntaxError: expected path separator ([) 
+0

findtextはxpathを使用する奇妙な方法のようです。特に、http://stackoverflow.com/questions/8692/how-to-use-xpath-in-pythonが別の方法を示していると考えます。 –

+0

Merydith:基本的なElementTree APIではなく、 'lxml'のような完全なXPathエンジンを使用してください。 –

答えて

2

このXPathは、そのkey属性がfalseに等しいbarノードを選択します:現在のコンテキストノード場合

/foo/bar[@key='false'] 

fooノードですこれも動作します:

./bar[@key='false'] 
+0

私はそれが構文だと思っていましたが、それはエラーを返します(元の投稿への更新を参照)。 –

+0

@Will Merydith - 現在のコンテキストノードが 'foo'ですか?最初の例を試してみてください。 – Oded

+0

私のコードの残りが働いているので、私はかなり確信しています(このXMLからたくさんのデータを取得しています)。最初の例を試してみると、「SyntaxError:要素に絶対パスを使用できません」というメッセージが表示されます。 –

3

私は間違っているかもしれないが、私は「./bar[@key='false']」の表記は、(それに付属しているのElementTreeまたは少なくともではない)のPython 2.5.5で動作していることと思ういけません。 Python 2.6.5でも同じ問題が発生していますが、Python 2.7.1でも動作します。私はあなたが別のライブラリを使用するか、Python 2.7で "実験的" GAEを試す必要があると思います。

+0

Python 2.5に含まれているElementTreeのソースを見ると、属性セレクタはサポートされていないようです。 –

1

回答hereに基づいて、XPathセレクタ機能は、Python 2.7に付属のバージョン1.3までElementTreeに実装されていませんでした(@cdemerssaid)。

0

は、 "[@attrib]" あなたが使用しているだけElementTreeの1.3で導入されました:だけはPython 2.7に導入された http://effbot.org/zone/element-xpath.htm

他の人がここで述べたようにhttps://docs.python.org/2/library/xml.etree.elementtree.html

、この属性を別に取得するか、Pythonをアップグレードしてそのコードが機能するようにする必要があります。

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

+0

答えは、 "[@attrib]"がET1.3に導入されていないことです。これは質問の不可欠な部分です。リンクだけがそれを証明します。 – aaviram