XPath ที่ถูกต้องสำหรับการเลือกคุณลักษณะที่มี“ foo” คืออะไร?


176

รับ XML นี้สิ่งที่ XPath ส่งกลับองค์ประกอบทั้งหมดที่มีpropแอตทริบิวต์Foo(สามโหนดแรก):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>

1
เหตุใดทุกคนจึงดูแอตทริบิวต์ "prop" ฉันพลาดอะไรไปหรือเปล่า? แค่บอกว่ารับสามโหนดแรก

6
ทุกคนดูที่คุณสมบัติเสาเพราะนั่นคือสิ่งที่ถูกถาม รับโหนดทั้งหมดที่ prop ประกอบด้วย "Foo" เพิ่ม <a prop="Foo5" /> แล้วคุณจะเห็นว่าทำไมมันไม่ใช่แค่ "สามโหนดแรก" ..
erlando

คำถามในร่างกายเป็นคำพูดที่ไม่ดีโดยไม่คำนึงถึงชื่อ foo สามารถอยู่ในแอตทริบิวต์ prop ใด ๆ ได้หรือไม่หรือคุณแค่ต้องการสามโหนดแรก

3
ใช่โปรดอ้างถึงชื่อ (และอย่าลังเลที่จะแก้ไข)
ripper234

หากคุณต้องการการเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์โปรดดูที่ find-an-
element- ซึ่งมีคุณสมบัติ -a

คำตอบ:


307
//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')]  

ฉันเพิ่มสิ่งนี้เพื่อประโยชน์ของความทั่วถึงและในจิตวิญญาณของการไหลเวียน :)


3
xmlme.comตอนนี้เปลี่ยนเส้นทางไปยังโฮสต์อื่น ๆ และดูเหมือนจะไม่โฮสต์เครื่องมือหรืออะไรทำนองนี้
jpmc26

26

XPath นี้จะให้คุณทุกโหนดที่มีแอตทริบิวต์ที่มี 'Foo' โดยไม่คำนึงถึงชื่อโหนดหรือชื่อแอตทริบิวต์:

//attribute::*[contains(., 'Foo')]/..

แน่นอนถ้าคุณสนใจเนื้อหาของแอตทริบิวต์เองมากขึ้นและไม่จำเป็นต้องมีโหนดพาเรนต์เพียงแค่วาง / ..

//attribute::*[contains(., 'Foo')]

2
สำหรับโหนดทั้งหมด//@*[contains(., 'Foo')]
aliopi

16
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 ()



4

คุณลองทำสิ่งต่อไปนี้:

// a [ประกอบด้วย (@prop, "Foo")]

ฉันไม่เคยใช้ฟังก์ชั่น contain มาก่อน แต่สงสัยว่าควรใช้งานได้ตามที่โฆษณาไว้ ...


@toddk ... คุณได้กำหนดเป้าหมายแอตทริบิวต์ที่ไม่มีอยู่: @foo คุณต้องการกำหนดเป้าหมาย @prop ;-)
Metro Smurf

4

หากคุณต้องการจับคู่เนื้อหาของลิงค์เองให้ใช้ text ():

//a[contains(@href,"/some_link")][text()="Click here"]



1

สำหรับรหัสด้านบน ... // * [ประกอบด้วย (@ prop, 'foo')]


นี้มีไว้สำหรับองค์ประกอบใด ๆ ที่มี foo ใน แต่คุณลักษณะจะต้องเป็น "เสา"
digiguru

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