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#
foreachstandard su qualsiasiCompositeNode(o chiamaGetEnumerator()direttamente) per attraversare i figli immediati di un nodo — l’enumeratore gestisce per te il contrattoIEnumerator<Node>. - Poiché
NodeEnumeratorimplementa ancheIDocumentPositionListener, evita di memorizzare nella cache un enumeratore durante modifiche strutturali all’albero; ottienilo nuovamente tramiteGetEnumerator()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), oppureGetChildNodes(nodeType, isDeep)conisDeepimpostato atrue, invece di annidare manualmente gli enumeratori.
Problemi comuni
| Problema | Causa | Correzione |
|---|---|---|
| Enumerare i figli del nodo mentre li si modifica genera eccezioni o salta nodi | L’albero è stato modificato strutturalmente durante l’enumerazione | Raccogli 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 originale | I valori DocumentPositionMovement non sono stati ispezionati | Verifica 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 / Enum | Descrizione |
|---|---|
NodeEnumerator | Implementazione IEnumerator<Node> / IDocumentPositionListener dietro l’iterazione for-each; Dispose(), Reset() |
DocumentPositionMovement | Enum 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 |