属性値によって要素を選択するXPath


193

以下のXMLがあります。

<?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を言っています、問題がどこにあるかわかりません。

回答:


274

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

//Employee[@id='4']

編集: Jensがコメントで指摘しているように、//一致するノードをドキュメント全体で検索するため、非常に遅くなる可能性があります。作業しているドキュメントの構造に一貫性がある場合は、フルパスを使用するのが最善の方法です。次に例を示します。

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

3
遅くなる可能性があるドキュメントのすべてのノードを//選択して検索することに注意してください。代わりに、ドキュメントの構造がわかっている場合は、以下のGillesの回答で提案されているように、適切なパスを使用してください。
イェンス、

@イェンスはい、それは絶対に本当です。付録を追加するために回答を編集しました。
JLRishe

12

これを試してください:

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

xmllintはIDを探す前にxmlファイル全体をメモリにロードしますか?46 GBのxmlファイルがあり、その中のIDを探しています
Hani Goc

46 GBのxmlファイル -問題があります。
ガーウィンダーシン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.