XPath - location path [relative location]
โพสต์แล้ว: 13/09/2014 3:17 pm
relative path คือการระบุเส้นทางผ่าน node โดยใช้ความสัมพันธ์ระหว่าง node ตามแบบโครงสร้างข้อมูลต้นไม้เป็นตัวอ้างอิงการระบุ
(อธิบายความสัมพันธ์ของแต่ละnodeตามโครงสร้างข้อมูลแบบต้นไม้ดูได้ที่นี่ค่ะ)
https://www.mindphp.com/forums/viewtopic ... 77&t=18492
การใช้จะเรียงลำดับตามลำดับก่อนหลังในเอกสาร xml ถ้ามีการเรียก node child และ node sibling พร้อมกัน node child จะได้ประมวลผลออกมาก่อนเสมอ (ความสัมพันธ์ใกล้ชิดกว่า)
รูปแบบ Syntax ของการระบุเส้นทางแบบ relative location
*predicate คือตัวที่ช่วยให้เราระบุลักษณะของ node ได้แม่นยำขึ้น เช่น price>35, @lang='en'
XPath มี axisname อะไรให้ใช้บ้าง
ancestor
เลือก parent node (node พ่อแม่ พ่อแม่ของพ่อแม่ พ่อแม่ของพ่อแม่ของพ่อแม่ งงล่ะสิ สรุปรวมๆเรียกว่า node บรรพบุรุษ โอเค จบ ) ตัวอย่าง
ให้ B2 เป็น current node
ancestor::*
ฺB2 คือ node ที่อยู่ปัจจุบัน ถ้าถามว่าบรรพบุรุษของ B2 มีใครบ้างก็เริ่มนับลำดับย้อนขึ้นไปจากความใกล้ชิดก่อนก็จะได้ B และ MARY ตามลำดับ
count(ancestor::*) จะได้ค่ากลับมาเป็น 2
ancestor-or-self
คล้ายกับ ancestor แต่นับรวมตัวเองเข้าไปด้วย ตัวอย่าง
ให้ B2 เป็น current node
ancestor-or-self::*
cฺount(ancestor-or-self::*) จะได้ค่ากลับมาเป็น 3
child
เลือกเฉพาะ node ลูกของตัวเอง ไม่รวมตัวเองและหลานเหลนโหลน(grand child) ตัวอย่าง
ให้ C เป็น current node
child::*
เลือก node ลูกของ C ก็จะได้ C1 และ C2 ตามลำดับ
count(child::*) จะได้ค่ากลับมาเป็น 2
descendant
เลือก node ที่เป็นทายาทของตัวเองทั้งหมด ตัวอย่าง
ให้ C เป็น current node
descendant::*
เลือก node ลูกหลานของ C ทั้งหมด จะได้ C1 C2 CA1 CA2 ตามลำดับ
count(descendant::*) จะได้ค่ากลับมาเป็น 4
descendant-or-self
คล้ายกับ descendant คือเลือก node ที่เป็นทายาททั้งหมดแต่รวมตัวเองเข้าไปด้วย ตัวอย่าง
ให้ C เป็น current node
descendant-or-self::*
จะเลือก node ลูกหลานทั้งหมดของC และตัว node C เอง จะได้ C C1 C2 CA1 CA2 ตามลำดับ
count(descendant-or-self::*) จะได้ค่ากลับมาเป็น 5
following
ทุก node ที่ลำดับญาติอยู่ถัดจากตัวเองแต่ไม่รวมตัวเอง
คือ node พี่น้อง และลูกหลานของพี่น้องด้วย ตัวอย่าง
ให้ B เป็น current node
following::*
ทุก node ที่อยู่ถัดจากB ก็จะได้เป็น C, C1, C2, CA1, CA2, D, D1, D2
count(following::ฺ*) จะได้ค่ากลับมาเป็น 8
following-sibling
เฉพาะ node พี่น้องของตัวเองเท่านั้น ไม่รวมลูกหลานของพี่น้อง ตัวอย่าง
ให้ B เป็น current node
following-sibling::*
เลือก node พี่น้องของ B ก็จะได้เป็น C, D ตามลำดับ
count(following-sibling::*) จะได้ค่ากลับมาเป็น 2
(อธิบายความสัมพันธ์ของแต่ละnodeตามโครงสร้างข้อมูลแบบต้นไม้ดูได้ที่นี่ค่ะ)
https://www.mindphp.com/forums/viewtopic ... 77&t=18492
การใช้จะเรียงลำดับตามลำดับก่อนหลังในเอกสาร xml ถ้ามีการเรียก node child และ node sibling พร้อมกัน node child จะได้ประมวลผลออกมาก่อนเสมอ (ความสัมพันธ์ใกล้ชิดกว่า)
รูปแบบ Syntax ของการระบุเส้นทางแบบ relative location
*nodetest คือการระบุ node ที่เราต้องการaxisname::nodetest[predicate]
*predicate คือตัวที่ช่วยให้เราระบุลักษณะของ node ได้แม่นยำขึ้น เช่น price>35, @lang='en'
XPath มี axisname อะไรให้ใช้บ้าง
ancestor
เลือก parent node (node พ่อแม่ พ่อแม่ของพ่อแม่ พ่อแม่ของพ่อแม่ของพ่อแม่ งงล่ะสิ สรุปรวมๆเรียกว่า node บรรพบุรุษ โอเค จบ ) ตัวอย่าง
ให้ B2 เป็น current node
ancestor::*
ฺB2 คือ node ที่อยู่ปัจจุบัน ถ้าถามว่าบรรพบุรุษของ B2 มีใครบ้างก็เริ่มนับลำดับย้อนขึ้นไปจากความใกล้ชิดก่อนก็จะได้ B และ MARY ตามลำดับ
count(ancestor::*) จะได้ค่ากลับมาเป็น 2
ancestor-or-self
คล้ายกับ ancestor แต่นับรวมตัวเองเข้าไปด้วย ตัวอย่าง
ให้ B2 เป็น current node
ancestor-or-self::*
cฺount(ancestor-or-self::*) จะได้ค่ากลับมาเป็น 3
child
เลือกเฉพาะ node ลูกของตัวเอง ไม่รวมตัวเองและหลานเหลนโหลน(grand child) ตัวอย่าง
ให้ C เป็น current node
child::*
เลือก node ลูกของ C ก็จะได้ C1 และ C2 ตามลำดับ
count(child::*) จะได้ค่ากลับมาเป็น 2
descendant
เลือก node ที่เป็นทายาทของตัวเองทั้งหมด ตัวอย่าง
ให้ C เป็น current node
descendant::*
เลือก node ลูกหลานของ C ทั้งหมด จะได้ C1 C2 CA1 CA2 ตามลำดับ
count(descendant::*) จะได้ค่ากลับมาเป็น 4
descendant-or-self
คล้ายกับ descendant คือเลือก node ที่เป็นทายาททั้งหมดแต่รวมตัวเองเข้าไปด้วย ตัวอย่าง
ให้ C เป็น current node
descendant-or-self::*
จะเลือก node ลูกหลานทั้งหมดของC และตัว node C เอง จะได้ C C1 C2 CA1 CA2 ตามลำดับ
count(descendant-or-self::*) จะได้ค่ากลับมาเป็น 5
following
ทุก node ที่ลำดับญาติอยู่ถัดจากตัวเองแต่ไม่รวมตัวเอง
คือ node พี่น้อง และลูกหลานของพี่น้องด้วย ตัวอย่าง
ให้ B เป็น current node
following::*
ทุก node ที่อยู่ถัดจากB ก็จะได้เป็น C, C1, C2, CA1, CA2, D, D1, D2
count(following::ฺ*) จะได้ค่ากลับมาเป็น 8
following-sibling
เฉพาะ node พี่น้องของตัวเองเท่านั้น ไม่รวมลูกหลานของพี่น้อง ตัวอย่าง
ให้ B เป็น current node
following-sibling::*
เลือก node พี่น้องของ B ก็จะได้เป็น C, D ตามลำดับ
count(following-sibling::*) จะได้ค่ากลับมาเป็น 2