Navigation

Navigation

Aspose.Words FOSS per .NET include un piccolo Nodes.Navigation namespace per iterare e posizionarsi all’interno dell’albero dei nodi di un documento: NodeEnumerator, il tipo enumeratore alla base dell’iterazione in stile foreach sui nodi figlio, e DocumentPositionMovement, un’enumerazione che descrive come la posizione di un nodo si relaziona a quella di un altro durante il percorso. Questo è distinto dalle API di manipolazione dell’albero (inserimento, rimozione e riorganizzazione dei nodi) trattate nella Nodes pagina — questa pagina tratta lo spostamento e il confronto delle posizioni in un albero già esistente.


Iterazione dei nodi figli

Qualsiasi CompositeNode (la classe base per i nodi contenitori come Document, Section, Body e Paragraph) supporta l’iterazione in stile for-each sui propri figli immediati tramite GetEnumerator(), che — secondo la sua documentazione — consente l’iterazione in stile for-each sui nodi figli di un elemento. L’enumeratore restituito implementa IEnumerator<Node>; in questa superficie API, tale ruolo è svolto da NodeEnumerator, che implementa anche IDocumentPositionListener per tenere traccia delle variazioni di posizione mentre l’albero sottostante viene enumerato. NodeEnumerator espone i membri standard Dispose() e Reset() insieme al contratto IEnumerator<Node>.


Spostamento della posizione nel documento

DocumentPositionMovement è un’enumerazione con sei membri — None, Inside, StartEnd, Sibling, Above e Below — che rappresentano come una posizione nel documento si confronta con un’altra durante la navigazione dell’albero: se rimane invariata, se è spostata all’interno di un elemento, se è portata a un confine iniziale/finale, se è trasferita a un fratello, o se è posta sopra o sotto la posizione di riferimento. È definita in associazione con NodeEnumerator nella stessa area Nodes.Navigation della superficie API, riflettendo il suo ruolo nel monitorare le variazioni di posizione durante l’enumerazione.


Suggerimenti e buone pratiche

  • Usa un C# foreach standard su qualsiasi CompositeNode (o chiama GetEnumerator() direttamente) per attraversare i figli immediati di un nodo — l’enumeratore gestisce per te il contratto IEnumerator<Node>.
  • Poiché NodeEnumerator implementa anche IDocumentPositionListener, evita di memorizzare nella cache un enumeratore durante modifiche strutturali all’albero; ottienilo nuovamente tramite GetEnumerator() se la raccolta di nodi che stai iterando è cambiata.
  • Per attraversamenti profondi dell’albero (non solo i figli immediati), usa Node.NextPreOrder(rootNode) / PreviousPreOrder(rootNode), oppure GetChildNodes(nodeType, isDeep) con isDeep impostato a true, invece di annidare manualmente gli enumeratori.

Problemi comuni

ProblemaCausaCorrezione
Enumerare i figli del nodo mentre li si modifica genera eccezioni o salta nodiL’albero è stato modificato strutturalmente durante l’enumerazioneRaccogli i nodi in un array prima (ad esempio con NodeCollection.ToArray()), quindi itera l’array mentre modifichi l’albero
Non è chiaro come una posizione spostata si relazioni a quella originaleI valori DocumentPositionMovement non sono stati ispezionatiVerifica il DocumentPositionMovement segnalato (Inside, StartEnd, Sibling, Above, Below o None) invece di presumere una relazione specifica

FAQ

Devo usare NodeEnumerator direttamente?

Di solito no — un C# foreach standard su un CompositeNode lo utilizza implicitamente tramite GetEnumerator(). Usalo direttamente solo quando hai bisogno di un controllo esplicito su Dispose()/Reset().

Cosa descrive DocumentPositionMovement?

La relazione tra due posizioni nell’albero del documento durante la navigazione — None, Inside, StartEnd, Sibling, Above o Below.

In che modo questo è diverso dalle API di manipolazione dell’albero nella pagina Nodes?

Il Nodes La pagina tratta l’inserimento, la rimozione, la clonazione e la riorganizzazione dei nodi. Questa pagina tratta l’attraversamento in sola lettura e il posizionamento all’interno di un albero già esistente.


API Reference Riepilogo

Classe / EnumDescrizione
NodeEnumeratorImplementazione IEnumerator<Node> / IDocumentPositionListener dietro l’iterazione for-each; Dispose(), Reset()
DocumentPositionMovementEnum a sei membri che descrive la posizione relativa durante il percorso (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()Restituisce l’enumeratore dei figli immediati del nodo

Vedi anche

 Italiano