ฉันมีเอกสารดังต่อไปนี้:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
ฉันจะได้รับความคุ้มค่าของ<cc>
การใช้ XPath ถ้า<bb>
เป็นzz
?
ฉันมีเอกสารดังต่อไปนี้:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
ฉันจะได้รับความคุ้มค่าของ<cc>
การใช้ XPath ถ้า<bb>
เป็นzz
?
คำตอบ:
ไม่แน่ใจว่าทำไมทุกคนถึงถามหาพี่น้องคุณยังสามารถตรวจสอบ<bb/>
-elements ที่ตรงกับเพรดิเคตจากเพรดิเคต<a/>
:
//a[bb/text() = "zz"]/cc/text()
*-sibling
แกน +1 แม้ว่า
สิ่งที่คุณต้องการคือfollowing-sibling
แกน XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
ทดสอบ Xpath ที่นี่: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
ถาม: จะเลือกโหนดโดยใช้ XPath ได้อย่างไรหากโหนดพี่น้องมีค่าเฉพาะ
เนื่องจากมีเพียง "แกน XPath" สำหรับการติดตามพี่น้องและก่อนหน้านี้คุณสามารถใช้หนึ่งในนั้นได้หากตำแหน่งได้รับการแก้ไข
แต่ดีกว่า:
มองหาcc
ว่าพ่อแม่มีลูกbb
ด้วยค่า'zz'
:
//cc[../bb='zz']
//a[bb = 'zz']/cc
.
ก่อนอื่นตัวอย่างของคุณไม่ใช่ XML ที่มีรูปแบบที่ดี เมื่อมองข้ามสิ่งนั้นและคุณไม่ได้อธิบายเจตนาของคุณได้เป็นอย่างดี (คุณต้องการเลือกเงื่อนไขใดกันแน่?) ฉันคิดว่าคุณต้องการทำสิ่งนี้:
//cc[preceding-sibling::bb[text()="zz"]]/text()
มันเลือก
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
คุณสามารถเขียนได้เช่นกัน
//bb[text()="zz"]/following-sibling::cc/text()
โปรดดูข้อมูลจำเพาะมีตัวอย่างที่อ่านได้ดีซึ่งคุณจะได้เรียนรู้มากมาย
//a/cc[../bb='zz']/text()
// a: เลือกองค์ประกอบ "a" ทั้งหมดไม่ว่าจะอยู่ที่ใด
// a / cc: เลือกองค์ประกอบ "cc" ที่เป็นลูกขององค์ประกอบ "a" (ไม่ว่า a จะอยู่ที่ใด)
.. : เลือกพาเรนต์ของโหนดปัจจุบัน
[../bb='zz ']: โดยที่ค่าขององค์ประกอบ' bb 'พี่น้องคือ zz
อีกวิธีหนึ่งสำหรับปัญหานี้คือ
//bb[contains(.,'zz')]/../cc/text()
คำอธิบาย : bb
สิ่งที่มี'zz'
สตริงในโหนดลูกทั้งหมดจากbb
นั้นไปที่โหนดแม่ของการbb
ใช้..
นั้นตอนนี้เราสามารถเข้าถึงcc
ข้อความที่ส่งคืนได้
ฉันหวังว่าคำอธิบายจะไม่ซับซ้อน