รับ XML นี้สิ่งที่ XPath ส่งกลับองค์ประกอบทั้งหมดที่มีprop
แอตทริบิวต์Foo
(สามโหนดแรก):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
รับ XML นี้สิ่งที่ XPath ส่งกลับองค์ประกอบทั้งหมดที่มีprop
แอตทริบิวต์Foo
(สามโหนดแรก):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
คำตอบ:
//a[contains(@prop,'Foo')]
ใช้งานได้ถ้าฉันใช้ XML นี้เพื่อให้ได้ผลลัพธ์กลับมา
<bla>
<a prop="Foo1">a</a>
<a prop="Foo2">b</a>
<a prop="3Foo">c</a>
<a prop="Bar">a</a>
</bla>
แก้ไข: สิ่งอื่นที่ควรทราบคือในขณะที่ XPath ด้านบนจะส่งคืนคำตอบที่ถูกต้องสำหรับ xml นั้นหากคุณต้องการรับประกันว่าคุณจะได้รับ "a" องค์ประกอบในองค์ประกอบ "bla" เท่านั้นคุณควรเป็นคนอื่น ๆ ที่กล่าวถึงใช้ด้วย
/bla/a[contains(@prop,'Foo')]
สิ่งนี้จะค้นหาองค์ประกอบ "a" ทั้งหมดในเอกสาร xml ทั้งหมดของคุณโดยไม่คำนึงถึงการซ้อนในองค์ประกอบ "blah"
//a[contains(@prop,'Foo')]
ฉันเพิ่มสิ่งนี้เพื่อประโยชน์ของความทั่วถึงและในจิตวิญญาณของการไหลเวียน :)
xmlme.com
ตอนนี้เปลี่ยนเส้นทางไปยังโฮสต์อื่น ๆ และดูเหมือนจะไม่โฮสต์เครื่องมือหรืออะไรทำนองนี้
XPath นี้จะให้คุณทุกโหนดที่มีแอตทริบิวต์ที่มี 'Foo' โดยไม่คำนึงถึงชื่อโหนดหรือชื่อแอตทริบิวต์:
//attribute::*[contains(., 'Foo')]/..
แน่นอนถ้าคุณสนใจเนื้อหาของแอตทริบิวต์เองมากขึ้นและไม่จำเป็นต้องมีโหนดพาเรนต์เพียงแค่วาง / ..
//attribute::*[contains(., 'Foo')]
//@*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]
หรือ:
/bla/a[contains(@prop,'Foo')]
หรือ:
/bla/a[position() <= 3]
ชำแหละ:
descendant-or-self::
The Axis - ค้นหาผ่านทุกโหนดภายใต้และตัวโหนดเอง มันมักจะดีกว่าที่จะพูดนี้กว่า // ฉันพบการใช้งานบางอย่างที่ // หมายถึงที่ใดก็ได้ (decendant หรือ self ของโหนดรูท) อื่น ๆ ใช้แกนเริ่มต้น
* or /bla/a
แท็ก - การจับคู่ไวด์การ์ดและ / bla / a เป็นพา ธ ที่สมบูรณ์
[contains(@prop,'Foo')] or [position() <= 3]
เงื่อนไขภายใน [] @prop ย่อมาจาก attribute :: prop เนื่องจาก attribute เป็นอีกแกนการค้นหา หรือคุณสามารถเลือก 3 รายการแรกโดยใช้ฟังก์ชัน position ()
John C ใกล้เคียงที่สุด แต่ XPath คำนึงถึงขนาดตัวพิมพ์ดังนั้น XPath ที่ถูกต้องน่าจะเป็น:
/bla/a[contains(@prop, 'Foo')]
คุณลองทำสิ่งต่อไปนี้:
// a [ประกอบด้วย (@prop, "Foo")]
ฉันไม่เคยใช้ฟังก์ชั่น contain มาก่อน แต่สงสัยว่าควรใช้งานได้ตามที่โฆษณาไว้ ...
หากคุณต้องการจับคู่เนื้อหาของลิงค์เองให้ใช้ text ():
//a[contains(@href,"/some_link")][text()="Click here"]
/ bla / a [ประกอบด้วย (@prop, "foo")]
สำหรับรหัสด้านบน ... // * [ประกอบด้วย (@ prop, 'foo')]
ลองนี้:
// a [มี (@ เสา 'foo')]
ที่ควรใช้กับแท็ก "a" ใด ๆ ในเอกสาร