でXPathを使用してテキストによる要素を探しますか?ありがとう次のようなXMLを考えるとElementTreeの
10
A
答えて
29
AFAIK ElementTreeはXPathをサポートしていません。それは変更されましたか?
とにかく、あなたはlxmlと次のXPath式を使用することができます。
import lxml.etree
doc = lxml.etree.parse('t.xml')
print doc.xpath('//element[text()="A"]')[0].text
print doc.xpath('//element[text()="A"]')[0].tag
結果は以下のようになります。
A
element
9
あなたはむしろlxmlのよりも、標準ライブラリElementTreeを使用したい場合は、繰り返しを使用して、特定のテキスト値を持つすべてのサブ要素を見つけることができます。たとえば、次のように
import sys
import xml.etree.ElementTree as etree
s = """<root>
<element>A</element>
<element>B</element>
</root>"""
e = etree.fromstring(s)
if sys.version_info < (2, 7):
found = [element for element in e.getiterator() if element.text == 'A']
else:
found = [element for element in e.iter() if element.text == 'A']
print found[0].text # This prints 'A', honestly!
注:あなたはリスト内包であなたの要素のtext
値のいくつかのストリッピングを実行することがあります。
これは、XMLツリーの任意の深さまで機能します。例えば、
s = """<root>
<element>A</element>
<element><sub>A</sub></element>
</root>"""
found = [element for element in e.getiterator() if element.text == 'A']
for f in found:
print f
はあなたがXPath in ElementTreeを使用することができます
<Element element at 7f20a882e3f8>
<Element sub at 7f20a882e4d0>
0
を印刷します。 libをインストールする必要はありません。 @Bionicegeniusからのコメント怒鳴るが説明するように、あなたの要素は何人の兄弟を持っていない場合
config.findall('.//*[element="A"]/element')
は、ちょうど上記の式は動作しますが、あなたは、要素ツリーでXPathを使用してのアイデアを得ます。
+0
これは問題があります所望のノードと同じレベルのすべての要素を選択する。これにより、値AとBの両方の要素が見つかります。 これを変更して検索すると、Bを検索した場合でも、値がAの要素のみが検索されます。最初の子のみが返されます。 – Bioniclegenius
関連する問題
- 1. は、どのように、次のXMLを考えるとタグ名
- 2. 次のXMLを考えるとXSD
- 3. XMLスキーマのキー/次のXML-スニペットを考えるとkeyref問題
- 4. は、次のXMLを考える
- 5. は次のように可能な値を考えるとスプリット
- 6. 次のXMLファイルを考えると属性
- 7. カスタムGsonデシリアライゼーション次のようなJSONスニペットを考える
- 8. 次のようになり、大きな入力ファイルを考えるとperlの
- 9. 次のようにURLを考えるとfoo.bar.car.com
- 10. 次を考えるとSQL
- 11. MATLAB次のような整数のベクトルを考えると整数
- 12. 次のサンプルを考えるとAndroidの
- 13. 次を考えるのPython
- 14. .NETのXmlシリアライザーオプションの属性次のコードを考える
- 15. 次のようになります文書を考えるとRavenDB
- 16. ジャンゴ:次のシナリオを考えるとデコレータ
- 17. |次のテキストを考えると「カテゴリー」
- 18. jChart2D - 次のコードを考えるとTracePoint2D
- 19. Xqueryの次のXML変数を考える
- 20. レール、ルビー - 正規表現を考える - のようなものを考える
- 21. のRails 3.1は、次のモデルを考えるとポリモーフィックな関連
- 22. はどのようにJavaScriptのコード次を考えると、外側部材
- 23. 次を考える/機能
- 24. は次のようにヘッダを考えるとポインタ+サイズまたは範囲
- 25. はのは、次のことを考えてみましょう
- 26. は次第に考える
- 27. パンダは、次のデータフレームを考えるグループバリュー
- 28. コンパイル次のコードを考える
- 29. キャッシュミス&キャッシュは、次のコードを考える
- 30. SimpleTestの次のコードを考えるのassertEqualsとPHPの種類
自分のタスクではメモリオーバーヘッドが非常に小さいため(CPU使用量よりもメモリが重要です)、これはlxmlから移動するために必要なコードの最後のビットであるため、lxmlよりもcElementTreeを使用しました。 – Patrick