2013-01-09 8 views
143

私は以下のXMLを持っています。属性値で要素を選択するXPath

<?xml version="1.0" encoding="UTF-8"?> 
<Employees> 
    <Employee id="3"> 
     <age>40</age> 
     <name>Tom</name> 
     <gender>Male</gender> 
     <role>Manager</role> 
    </Employee> 
    <Employee id="4"> 
     <age>25</age> 
     <name>Meghna</name> 
     <gender>Female</gender> 
     <role>Manager</role> 
    </Employee> 
</Employees> 

id = "4"のEmployee要素を選択します。

私は何も返さないXPath式以下を使用しています。

//Employee/[@id='4']/text() 

私はhttp://chris.photobooks.com/xml/default.htmでそれをチェックし、それが無効のxpathではなく、必ず問題があると言います。

答えて

215

[の前に/を削除する必要があります。述語([]の部分)の直前にはスラッシュを入れてはいけません。また、Employee要素自体を選択するには、末尾に/text()を残してください。そうしないと、Employee要素のすぐ下にある空白のテキスト値を選択するだけです。

//Employee[@id='4'] 

編集:イェンスコメントで指摘したように、それが一致するノードのために文書全体を検索するため//が非常に遅くすることができます。あなたが作業している文書の構造が一致するように起こっている場合は、おそらく完全なパスを使用してオフに最高です、例えば:

/Employees/Employee[@id='4'] 
+2

注 'こと// 'は、文書のすべての*ノードを選択して検索しますが、遅くなる可能性があります。代わりに、ドキュメントの構造がわかっている場合は、[Gilles 'answer](http://stackoverflow.com/questions/14248063/xpath-to-select-element-by-attribute-value #14248129)をご覧ください。 – Jens

+0

@Jensはい、それは絶対に真です。私は補遺を追加するために私の答えを編集しました。 – JLRishe

8

はこれをやってみてください。

/Employees/Employee[@id=4]/*/text() 
+0

xmlllはxmlファイル全体をメモリにロードしてからidを探しますか?私は46 GBのXMLファイルを持っていて、その中のIDを探しています –

関連する問題