XPath เพื่อเลือกองค์ประกอบตามค่าแอตทริบิวต์


195

ฉันมี 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"

ฉันใช้นิพจน์ XPath ด้านล่างซึ่งไม่ได้ส่งคืนอะไร

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

ฉันตรวจสอบแล้วที่http://chris.photobooks.com/xml/default.htmและมันบอกว่า xpath ไม่ถูกต้องไม่แน่ใจว่าปัญหาอยู่ที่ไหน

คำตอบ:


278

คุณจำเป็นต้องเอาออกก่อน/ [เพรดิเคต (ส่วนต่าง ๆ[ ]) ไม่ควรมีการทับหน้าพวกเขา นอกจากนี้ในการเลือกองค์ประกอบของพนักงานคุณควรปล่อยออก/text()ตอนท้ายหรือมิฉะนั้นคุณเพียงแค่เลือกค่าข้อความช่องว่างทันทีภายใต้องค์ประกอบพนักงาน

//Employee[@id='4']

แก้ไข:ตามที่ Jens ชี้ให้เห็นในความคิดเห็น//อาจช้ามากเพราะมันค้นหาทั้งเอกสารเพื่อหาโหนดที่ตรงกัน หากโครงสร้างของเอกสารที่คุณกำลังทำงานนั้นสอดคล้องกันคุณน่าจะใช้พา ธ แบบเต็มตัวอย่างเช่น:

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

3
โปรดทราบว่า//เลือกและค้นหาโหนดทั้งหมดของเอกสารซึ่งอาจช้า แต่ถ้าโครงสร้างของเอกสารเป็นที่รู้จักก็ให้ใช้เส้นทางที่เหมาะสมเช่นแนะนำในคำตอบของ Gillesด้านล่าง
Jens

@ Jens ใช่มันเป็นเรื่องจริงอย่างแน่นอน ฉันได้แก้ไขคำตอบของฉันเพื่อเพิ่มภาคผนวก
JLRishe

13

คุณสามารถเลือก "โหนดทั้งหมดที่มีแอตทริบิวต์เฉพาะ" ดังนี้:

//*[@id='4']

12

ลองทำสิ่งนี้:

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

xmllint ทำการโหลดไฟล์ xml ทั้งหมดลงในหน่วยความจำก่อนค้นหารหัสหรือไม่ ฉันมีไฟล์ xml ขนาด 46 GB และฉันกำลังมองหารหัสอยู่ในนั้น
Hani Goc

ไฟล์ xml ขนาด 46 GB - มีปัญหา
Gurwinder Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.