Navigation
Navigation
Aspose.Words FOSS pentru .NET include un mic Nodes.Navigation spațiu de nume pentru iterarea și poziționarea în arborele de noduri al unui document: NodeEnumerator, tipul enumerator care stă în spatele iterației în stil for-each peste nodurile copil, și DocumentPositionMovement, o enumerare care descrie cum poziția unui nod se raportează la alta în timpul parcurgerii. Aceasta este distinctă de API-urile de manipulare a arborelui (inserare, eliminare și reorganizare a nodurilor) acoperite pe Nodes pagină — această pagină acoperă navigarea și compararea pozițiilor într-un arbore care există deja.
Iterarea nodurilor copil
Orice CompositeNode (clasa de bază pentru nodurile container, cum ar fi Document, Section, Body și Paragraph) suportă iterarea în stil for-each asupra copiilor săi direcți prin GetEnumerator(), care — conform documentației sale — oferă suport pentru stilul de iterare for-each asupra nodurilor copil ale unui nod. Enumeratorul returnat implementează IEnumerator<Node>; în această suprafață API, acel rol este îndeplinit de NodeEnumerator, care de asemenea implementează IDocumentPositionListener pentru a putea urmări modificările de poziție în timp ce arborele de bază este enumerat. NodeEnumerator expune membrii standard Dispose() și Reset() alături de contractul IEnumerator<Node>.
Mișcarea poziției în document
DocumentPositionMovement este o enumerare cu șase membri — None, Inside, StartEnd, Sibling, Above și Below — care reprezintă modul în care o poziție în document se raportează la alta pe măsură ce arborele este navigat: dacă rămâne neschimbată, mutată în interiorul unui nod, mutată la o limită de început/sfârșit, mutată la un frate, sau mutată deasupra sau dedesubtul poziției de referință. Este definită alături de NodeEnumerator în aceeași zonă Nodes.Navigation a suprafeței API, reflectând rolul său în urmărirea modificărilor de poziție în timpul enumerării.
Sfaturi și cele mai bune practici
- Utilizaţi un C#
foreachstandard peste oriceCompositeNode(sau apelaţiGetEnumerator()direct) pentru a parcurge copiii imediati ai unui nod — enumeratorul gestionează contractulIEnumerator<Node>pentru dvs. - Deoarece
NodeEnumeratorimplementează șiIDocumentPositionListener, evitaţi să memoraţi în cache un enumerator peste modificări structurale ale arborelui; obţineţi-l din nou prinGetEnumerator()dacă colecţia de noduri pe care o iteraţi s-a schimbat. - Pentru parcurgeri adânci ale arborelui (nu numai copiii imediati), utilizaţi
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), sauGetChildNodes(nodeType, isDeep)cuisDeepsetat latrue, în loc să înlănţuiţi enumeratori manual.
Probleme comune
| Problemă | Cauză | Remediere |
|---|---|---|
| Enumerarea copiilor unui nod în timp ce îi modifici aruncă sau omite noduri | Arborele a fost modificat structural în timpul enumerării | Colectează nodurile într-un tablou mai întâi (de exemplu cu NodeCollection.ToArray()), apoi iterează tablou în timp ce modifici arborele |
| Nu e sigur cum se raportează o poziție mutată la cea originală | Valorile DocumentPositionMovement nu au fost inspectate | Verifică DocumentPositionMovement raportat (Inside, StartEnd, Sibling, Above, Below sau None) în loc să presupui o relație specifică |
FAQ
Trebuie să folosesc NodeEnumerator direct?
De obicei nu — C# foreach standard peste un CompositeNode îl foloseşte implicit prin GetEnumerator(). Apelaţi-l direct numai când aveţi nevoie de control explicit asupra Dispose()/Reset().
Ce descrie DocumentPositionMovement?
Relația dintre două poziții în arborele documentului în timpul navigării — None, Inside, StartEnd, Sibling, Above sau Below.
Cum diferă acest lucru de API-urile de manipulare a arborelui de pe pagina Nodes?
The Nodes pagina acoperă inserarea, eliminarea, clonarea și reorganizarea nodurilor. Această pagină acoperă traversarea în modul doar-citire și poziționarea într-un arbore care există deja.
API Reference Rezumat
| Clasă / Enum | Descriere: |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementare în spatele iterației foreach; Dispose(), Reset() |
DocumentPositionMovement | Enum cu șase membri care descrie poziția relativă în timpul traversării (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Returnează enumeratorul pentru copiii direcţi ai unui nod |