ElementTree XPath-属性に基づいて要素を選択
-
03-07-2019 - |
質問
サンプルコードを次に示します
XML
<root>
<target name="1">
<a></a>
<b></b>
</target>
<target name="2">
<a></a>
<b></b>
</target>
</root>
Python
def parse(document):
root = et.parse(document)
for target in root.findall("//target[@name='a']"):
print target._children
次の例外を受け取りました:
expected path separator ([)
解決
使用しようとしている構文は、 ElementTree 1.3 の新機能です。 。
このようなバージョンには、 Python 2.7 以上が付属しています。 Python 2.6以下を使用している場合、ElementTree 1.2.6以下を使用できます。
他のヒント
このコードにはいくつかの問題があります。
-
PythonのビルトインElementTree(略してET)には、実際のXPATHサポートがありません。限られたサブセットのみ例では、
// target
のような root-from-root 式をサポートしていません。注意:ドキュメント &quot; // &quot;に言及していますが、それは子供向けです。
.// target
は有効です。// ...
は違います!代替実装があります: lxml の方が豊富です。ビルドインコードにドキュメントが使用されるのは継ぎ目です。一致しません/動作しません。
-
@name
表記はxml- attributes を選択します。 xmlタグ内のkey = value
式。そのため、指定されたドキュメントで何かを選択するには、name-valueが1または2でなければなりません。または、子 element 'a' :
target [a]
(@なし)を持つターゲットを検索できます。
ビルトインElementTree(v1.3)でルートに解析された特定のドキュメントでは、次のコードが正しく機能しています:
-
root.findall(&quot; .// target&quot;)
両方のターゲットを検索 -
root.findall(&quot; .// target / a&quot;)
2つのa要素を検索 -
root.findall(&quot; .// target [a]&quot;)
これにより、両方のターゲット要素が再び検出されます。両方にa要素があります -
root.findall(&quot; .// target [@ name = '1']&quot;)
first ターゲットのみを検索します。 1前後の引用符が必要であることに注意してください。それ以外の場合は、SyntaxErrorが発生します -
root.findall(&quot; .// target [a] [@ name = '1']&quot;)
も有効です。そのターゲットを見つける -
root.findall(&quot; .// target [@ name = '1'] / a&quot;)
a要素を1つだけ検索します。 ...
所属していません StackOverflow