XPath: เลือกโหนดข้อความ


150

มี XML ต่อไปนี้:

<node>Text1<subnode/>text2</node>

ฉันจะเลือกโหนดข้อความแรกหรือโหนดข้อความที่สองผ่าน XPath ได้อย่างไร

บางสิ่งเช่นนี้

/node/text()[2]

แน่นอนไม่ทำงานเพราะมันเป็นผลรวมของทุกข้อความในโหนด


11
คุณเขียน: /node/text()[2][ ... ] ไม่ได้เพราะมันเป็นผลของข้อความที่ผสานภายในโหนดทุกที่ที่ไม่ถูกต้องของมันหมายความว่าลูกคนที่สองโหนดข้อความของnodeองค์ประกอบราก ค่าสตริง (เรียงต่อกันของโหนดข้อความลูกหลาน) จะเป็นstring(/node)

คุณหมายความว่าแบบสอบถาม Xpath ควรทำงานอย่างไร ฉันเดาว่าฉันมีปัญหาอื่นที่อื่นแล้ว ;) ขอบคุณ!
เคอร์เนล

เป็นคำถามที่ดี +1 ดูคำตอบของฉันสำหรับคำอธิบายและนิพจน์ XPath หลายรายการที่เลือกชายด์ทั้งหมดหรือโหนดข้อความเฉพาะขององค์ประกอบด้านบน
Dimitre Novatchev

คำตอบ:


183

มี XML ต่อไปนี้:

<node>Text1<subnode/>text2</node> 

ฉันจะเลือกโหนดข้อความแรกหรือโหนดข้อความที่สองผ่าน XPath ได้อย่างไร

ใช้ :

/node/text()

สิ่งนี้เลือกชายด์โหนดข้อความทั้งหมดของอิลิเมนต์บนสุด (ชื่อ "node") ของเอกสาร XML

/node/text()[1]

สิ่งนี้เลือกชายด์ text-node แรกของอิลิเมนต์บนสุด (ชื่อ "node") ของเอกสาร XML

/node/text()[2]

สิ่งนี้เลือกชายด์ text-node ที่สองของอิลิเมนต์บนสุด (ชื่อ "node") ของเอกสาร XML

/node/text()[someInteger]

สิ่งนี้เลือกชายด์เท็กซ์โหนดบางอินเทอร์เนอร์ขององค์ประกอบด้านบน (ชื่อ "โหนด") ของเอกสาร XML มันเทียบเท่ากับนิพจน์ XPath ต่อไปนี้:

/node/text()[position() = someInteger]

@NaftuliTzviKay: หมายความว่า Chrome เสีย /node[2]ต้องไม่เลือกโหนดใด ๆ หากเอกสาร XML ต้นทางมีรูปแบบที่ถูกต้อง ตามคำจำกัดความในเอกสาร XML ที่มีรูปแบบที่ดีนั้นมีองค์ประกอบบนสุดเพียงหนึ่งเดียวหรือที่รู้จักกันในชื่อdocument-element
Dimitre Novatchev

1
ทำงานใน PHP หรือไม่ ฉันพยายามที่จะวนลูปผ่านโหนดข้อความเท่านั้นแม้แต่ที่อยู่ในระหว่างชุดของแท็ก ปัญหาคือว่ายอดเยี่ยมเนื้อหาของโหนดข้อความหลายรายการด้วยกันโดยไม่คำนึงถึงแท็ก ใช้//*[text()]อยู่ดี /html/text()ไม่ทำงาน, ไม่เป็นผล.
Aaron Gillion

2
@AaronGillion, ใช่, AFAIK PHP มีการประเมิน XPath 1.0 ที่ทำงานได้อย่างถูกต้อง โปรดทราบ/html/text()ว่าไม่ได้เลือกโหนดข้อความทั้งหมดในเอกสาร - เฉพาะโหนดข้อความที่เป็นลูก (ไม่สืบทอด) ของhtmlองค์ประกอบด้านบน /html//text() คุณอาจต้องการ โดยทั่วไปจำเป็นต้องมีความรู้และความเข้าใจ XPath เพื่อสร้างนิพจน์ XPath
Dimitre Novatchev

ขอบคุณ ฉันคิดว่าเคล็ดลับการเฉือนสองครั้งที่ผ่านมาเล็กน้อย!
Aaron Gillion

@ AaronGillion คุณยินดีต้อนรับ คุณสามารถเรียนรู้พื้นฐานของ XPath 1.0 และ 2.0 ในโมดูลที่ 2 ของหลักสูตรฝึกอบรมออนไลน์นี้: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

xpath ของคุณควรทำงาน ฉันได้ทดสอบ xpath และของฉันทั้งในการใช้งาน MarkLogic และ Zorba Xquery / Xpath

ทั้งสองควรทำงาน

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.