XPath untuk memilih Elemen dengan nilai atribut


195

Saya telah mengikuti 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>

Saya ingin memilih elemen Karyawan dengan id = "4".

Saya menggunakan ekspresi XPath di bawah ini yang tidak mengembalikan apa pun.

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

Saya memeriksanya di http://chris.photobooks.com/xml/default.htm dan dikatakan xpath tidak valid, tidak yakin di mana masalahnya.

Jawaban:


278

Anda harus menghapus /sebelum [. Predikat (bagian dalam [ ]) seharusnya tidak memiliki garis miring segera sebelum mereka. Juga, untuk memilih elemen Karyawan itu sendiri, Anda harus meninggalkan /text()di akhir atau kalau tidak Anda hanya akan memilih nilai teks spasi langsung di bawah elemen Karyawan.

//Employee[@id='4']

Sunting: Seperti yang Jens tunjukkan dalam komentar, //bisa sangat lambat karena mencari seluruh dokumen untuk menemukan simpul yang cocok. Jika struktur dokumen yang Anda kerjakan akan konsisten, Anda mungkin lebih baik menggunakan path lengkap, misalnya:

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

3
Perhatikan bahwa //memilih dan mencari semua simpul dokumen yang bisa lambat. Sebaliknya, jika struktur dokumen diketahui maka gunakan jalur yang benar, seperti yang disarankan dalam jawaban Gilles di bawah ini.
Jens

@ Jens Ya, itu benar sekali. Saya telah mengedit jawaban saya untuk menambahkan addendum.
JLRishe

13

Sebagai tindak lanjut, Anda dapat memilih "semua node dengan atribut tertentu" seperti ini:

//*[@id='4']

12

Coba lakukan ini:

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

apakah xmllint memuat seluruh file xml ke dalam memori sebelum mencari id ?. Saya memiliki file xml 46 GB dan saya mencari id di dalamnya
Hani Goc

file xml dari 46 GB - ada masalah.
Gurwinder Singh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.