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