Navigation

Navigation

Aspose.Words FOSS สำหรับ .NET มีส่วนเล็ก Nodes.Navigation เนมสเปซสำหรับการวนซ้ำและการกำหนดตำแหน่งภายในต้นไม้โหนดของเอกสาร: NodeEnumerator, ประเภท enumerator ที่อยู่เบื้องหลังการวนซ้ำแบบ for-each บนโหนดลูก, และ DocumentPositionMovement, การนับรายการที่อธิบายว่าตำแหน่งของโหนดหนึ่งสัมพันธ์กับอีกโหนดหนึ่งอย่างไรระหว่างการเดินทาง. สิ่งนี้แตกต่างจาก API การจัดการต้นไม้ (การแทรก, การลบ, และการจัดเรียงโหนดใหม่) ที่อธิบายไว้บน Nodes หน้า — หน้านี้ครอบคลุมการเคลื่อนที่และการเปรียบเทียบตำแหน่งในต้นไม้ที่มีอยู่แล้ว.


การวนซ้ำโหนดลูก

ใดก็ได้ CompositeNode (คลาสฐานสำหรับโหนดคอนเทนเนอร์เช่น Document, Section, Body และ Paragraph) รองรับการวนซ้ำแบบ for-each บนลูกโดยตรงผ่าน GetEnumerator() ซึ่ง — ตามเอกสารของมัน — ให้การสนับสนุนการวนซ้ำแบบ for-each บนโหนดลูกของโหนดหนึ่ง. enumerator ที่ส่งกลับมานั้นทำงานตาม IEnumerator<Node>; ในพื้นผิว API นี้, บทบาทนั้นถูกเติมเต็มโดย NodeEnumerator, ซึ่งยังทำงานตาม IDocumentPositionListener เพื่อให้สามารถติดตามการเปลี่ยนแปลงตำแหน่งขณะต้นไม้พื้นฐานกำลังถูก enumeration. NodeEnumerator เปิดเผยสมาชิกมาตรฐาน Dispose() และ Reset() ควบคู่กับสัญญา IEnumerator<Node>.


การเคลื่อนที่ตำแหน่งเอกสาร

DocumentPositionMovement เป็น enumeration ที่มีหกสมาชิก — None, Inside, StartEnd, Sibling, Above และ Below — แสดงถึงวิธีที่ตำแหน่งหนึ่งในเอกสารสัมพันธ์กับตำแหน่งอื่นขณะเดินทางผ่านต้นไม้: ไม่เปลี่ยนแปลง, ย้ายเข้าไปในโหนด, ย้ายไปยังขอบเริ่มต้น/สิ้นสุด, ย้ายไปยังโหนดพี่น้อง, หรือย้ายขึ้นหรือลงเหนือหรือใต้ตำแหน่งอ้างอิง. มันถูกกำหนดพร้อมกับ NodeEnumerator ในพื้นที่ Nodes.Navigation เดียวกันของพื้นผิว API, สะท้อนบทบาทของมันในการติดตามการเปลี่ยนแปลงตำแหน่งระหว่างการ enumeration.


เคล็ดลับและแนวปฏิบัติที่ดีที่สุด

  • ใช้ C# foreach มาตรฐานบน CompositeNode ใด ๆ (หรือเรียก GetEnumerator() โดยตรง) เพื่อเดินผ่านลูกของโหนดโดยตรง — ตัว enumerator จะจัดการสัญญา IEnumerator<Node> ให้คุณ.
  • เนื่องจาก NodeEnumerator ยังทำงานร่วมกับ IDocumentPositionListener อยู่, ควรหลีกเลี่ยงการแคช enumerator ขณะทำการแก้ไขโครงสร้างของต้นไม้; ขอรับใหม่ผ่าน GetEnumerator() หากชุดโหนดที่คุณกำลังวนซ้ำมีการเปลี่ยนแปลง.
  • สำหรับการเดินลึกในต้นไม้ (ไม่ใช่แค่ลูกโดยตรง), ให้ใช้ Node.NextPreOrder(rootNode) / PreviousPreOrder(rootNode), หรือ GetChildNodes(nodeType, isDeep) พร้อมตั้งค่า isDeep เป็น true, แทนการซ้อน enumerator ด้วยตนเอง.

ปัญหาทั่วไป

ปัญหาสาเหตุการแก้ไข
การวนลูปลูกของโหนดขณะแก้ไขพวกมันทำให้เกิดข้อผิดพลาดหรือข้ามโหนดต้นไม้ถูกเปลี่ยนแปลงโครงสร้างระหว่างการวนลูปเก็บโหนดไว้ในอาร์เรย์ก่อน (เช่นด้วย NodeCollection.ToArray()) แล้ววนลูปอาร์เรย์ขณะแก้ไขต้นไม้
ไม่แน่ใจว่าตำแหน่งที่ย้ายไปสัมพันธ์กับตำแหน่งเดิมอย่างไรค่า DocumentPositionMovement ไม่ได้ถูกตรวจสอบตรวจสอบ DocumentPositionMovement ที่รายงาน (Inside, StartEnd, Sibling, Above, Below หรือ None) แทนการสันนิษฐานความสัมพันธ์เฉพาะ

FAQ

ฉันจำเป็นต้องใช้ NodeEnumerator โดยตรงหรือไม่?

โดยทั่วไปไม่จำเป็น — C# foreach มาตรฐานบน CompositeNode จะใช้มันโดยอ้อมผ่าน GetEnumerator(). ให้เรียกใช้โดยตรงเฉพาะเมื่อคุณต้องการการควบคุมอย่างชัดเจนเหนือ Dispose()/Reset().

DocumentPositionMovement อธิบายอะไร?

ความสัมพันธ์ระหว่างตำแหน่งสองตำแหน่งในต้นไม้เอกสารระหว่างการนำทาง — None, Inside, StartEnd, Sibling, Above, หรือ Below.

นี่แตกต่างจาก API การจัดการต้นไม้ในหน้า Nodes อย่างไร?

The Nodes หน้านี้ครอบคลุมการแทรก, การลบ, การโคลน และการจัดระเบียบโหนดใหม่ หน้านี้ครอบคลุมการเดินทางแบบอ่านอย่างเดียวและการกำหนดตำแหน่งภายในต้นไม้ที่มีอยู่แล้ว.


API Reference สรุป

คลาส / Enumคำอธิบาย
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener การทำงานเบื้องหลังการวนซ้ำแบบ for-each; Dispose(), Reset()
DocumentPositionMovementenum หกสมาชิกที่อธิบายตำแหน่งสัมพัทธ์ระหว่างการเดินทาง (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()ส่งคืน enumerator สำหรับลูกโหนดโดยตรง

ดูเพิ่มเติม

 ภาษาไทย