XPath: วิธีการเลือกองค์ประกอบตามมูลค่าของพวกเขา?


221

ฉันยังใหม่กับการใช้ XPath และนี่อาจเป็นคำถามพื้นฐาน กรุณาอดทนกับฉันและช่วยฉันในการแก้ไขปัญหา ฉันมีไฟล์ XML เช่นนี้:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

ฉันสามารถตรวจสอบการมี<Element>แท็กด้วย:

// Element [@ attribute1 = "abc" และ @ attribute2 = "xyz"]

ตอนนี้ฉันต้องการตรวจสอบค่าของแท็กสำหรับสตริง"Data"ด้วย เพื่อให้บรรลุสิ่งนี้ฉันถูกบอกให้ใช้:

// Element [@ attribute1 = "abc" และ @ attribute2 = "xyz" และ Data]

เมื่อฉันใช้นิพจน์ในภายหลังฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อความยืนยันความล้มเหลว: ไม่มีการจับคู่โหนด //Element[@attribute1="abc" and @attribute2="xyz" and Data]

กรุณาให้คำแนะนำของคุณกับฉันว่านิพจน์ XPath ที่ฉันใช้นั้นถูกต้องหรือไม่ ถ้าไม่ใช่นิพจน์ XPath ที่ถูกต้องจะเป็นอย่างไร

คำตอบ:


329

เงื่อนไขด้านล่าง:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

ตรวจสอบการมีอยู่ขององค์ประกอบข้อมูลภายในองค์ประกอบและไม่ใช่ข้อมูลค่าองค์ประกอบ

แต่คุณสามารถใช้

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

เหตุผลที่ผมเพิ่มคำตอบนี้ก็คือว่าผมต้องการที่จะอธิบายความสัมพันธ์ของและ.text()

สิ่งแรกคือเมื่อใช้[]มีเพียงสองประเภทของข้อมูล:

  1. [number] เพื่อเลือกโหนดจากชุดโหนด
  2. [bool] เพื่อกรองชุดโหนดจากโหนดชุด

ในกรณีนี้ค่าจะถูกประเมินเป็นบูลีนตามฟังก์ชันboolean()และมีกฎ:

ตัวกรองจะถูกประเมินเสมอตามบริบท

เมื่อคุณต้องการที่จะเปรียบเทียบtext()หรือ.กับสตริง"Data"มันจะใช้string()ฟังก์ชั่นในการแปลงให้เป็นประเภทสตริงกว่าได้รับผลบูลีน

มีกฎสำคัญสองข้อเกี่ยวกับstring():

  1. string()ฟังก์ชันแปลงโหนดชุดสตริงโดยการกลับค่าสตริงของโหนดแรกในโหนชุดซึ่งในบางกรณีอาจให้ผลลัพธ์ที่ไม่คาดคิด

    text()เป็นทางญาติที่ส่งกลับโหนดชุดมีทุกโหนดข้อความของโหนดปัจจุบัน (โหนดบริบท) ["Data"]เช่น เมื่อมีการประเมินโดยstring(["Data"])มันจะส่งคืนโหนดแรกของโหนดชุดดังนั้นคุณจะได้รับ "ข้อมูล" เฉพาะเมื่อมีโหนดข้อความเดียวในโหนดชุด

  2. หากคุณต้องการให้string()ฟังก์ชั่นเชื่อมข้อความลูกทั้งหมดคุณจะต้องผ่านโหนดเดียวแทนการตั้งค่าโหนด

    ตัวอย่างเช่นเราได้รับโหนดชุด['a', 'b']คุณสามารถส่งผ่านมีโหนดแม่ไปstring(parent)นี้จะกลับมา'ab'และสาเหตุในกรณีที่คุณจะกลับมาตัดแบ่งเป็นสตริงstring(.)"Data"

ทั้งสองวิธีจะได้ผลลัพธ์เหมือนกันเฉพาะเมื่อมีโหนดข้อความ

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