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# foreach standard peste orice CompositeNode (sau apelaţi GetEnumerator() direct) pentru a parcurge copiii imediati ai unui nod — enumeratorul gestionează contractul IEnumerator<Node> pentru dvs.
  • Deoarece NodeEnumerator implementează și IDocumentPositionListener, evitaţi să memoraţi în cache un enumerator peste modificări structurale ale arborelui; obţineţi-l din nou prin GetEnumerator() 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), sau GetChildNodes(nodeType, isDeep) cu isDeep setat la true, î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 noduriArborele a fost modificat structural în timpul enumerăriiColectează 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 inspectateVerifică 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ă / EnumDescriere:
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener implementare în spatele iterației foreach; Dispose(), Reset()
DocumentPositionMovementEnum 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

Vezi și:

 Română