Navigation
Navigation
Aspose.Words FOSS para .NET incluye un pequeño Nodes.Navigation espacio de nombres para iterar y posicionar dentro del árbol de nodos del documento: NodeEnumerator, el tipo enumerador que sustenta la iteración estilo for-each sobre nodos hijos, y DocumentPositionMovement, una enumeración que describe cómo la posición de un nodo se relaciona con la de otro durante el recorrido. Esto es distinto de las API de manipulación del árbol (inserción, eliminación y reorganización de nodos) cubiertas en la Nodes página — esta página trata sobre desplazarse y comparar posiciones en un árbol que ya existe.
Iterando nodos hijos
Any CompositeNode (la clase base para nodos contenedores como Document, Section, Body y Paragraph) admite iteración estilo for-each sobre sus hijos inmediatos mediante GetEnumerator(), que — según su documentación — brinda soporte para la iteración estilo for-each sobre los nodos hijos. El enumerador devuelto implementa IEnumerator<Node>; en esta capa de API, esa función la desempeña NodeEnumerator, que también implementa IDocumentPositionListener para poder rastrear cambios de posición mientras se enumera el árbol subyacente. NodeEnumerator expone los miembros estándar Dispose() y Reset() junto al contrato IEnumerator<Node>.
Movimiento de posición en el documento
DocumentPositionMovement es una enumeración con seis miembros — None, Inside, StartEnd, Sibling, Above y Below — que representan cómo una posición en el documento se relaciona con otra al navegar el árbol: si permanece sin cambios, se desplaza dentro de un nodo, se mueve a un límite de inicio/final, se traslada a un hermano, o se sitúa por encima o por debajo de la posición de referencia. Se define junto a NodeEnumerator en la misma área Nodes.Navigation de la capa API, reflejando su papel en el seguimiento de cambios de posición durante la enumeración.
Consejos y buenas prácticas
- Utilice un C#
foreachestándar sobre cualquierCompositeNode(o invoqueGetEnumerator()directamente) para recorrer los hijos inmediatos de un nodo — el enumerador gestiona el contratoIEnumerator<Node>por usted. - Dado que
NodeEnumeratortambién implementaIDocumentPositionListener, evite almacenar en caché un enumerador entre modificaciones estructurales del árbol; vuelva a obtenerlo medianteGetEnumerator()si la colección de nodos que está iterando ha cambiado. - Para recorridos profundos del árbol (no solo los hijos inmediatos), utilice
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), oGetChildNodes(nodeType, isDeep)conisDeepconfigurado atrue, en lugar de anidar enumeradores manualmente.
Problemas comunes
| Problema | Causa | Corrección |
|---|---|---|
| Enumerar los hijos del nodo mientras se modifican genera excepciones o omite nodos | El árbol se modificó estructuralmente durante la enumeración | Recopila los nodos en una matriz primero (por ejemplo con NodeCollection.ToArray()), y luego recorre la matriz mientras modificas el árbol |
| No está claro cómo se relaciona una posición movida con la original | No se inspeccionaron los valores de DocumentPositionMovement | Verifica el DocumentPositionMovement informado (Inside, StartEnd, Sibling, Above, Below o None) en lugar de asumir una relación específica |
FAQ
¿Necesito usar NodeEnumerator directamente?
No suele ser necesario — el C# foreach estándar sobre un CompositeNode lo utiliza implícitamente a través de GetEnumerator(). Recurra a él directamente solo cuando necesite control explícito sobre Dispose()/Reset().
¿Qué describe DocumentPositionMovement?
La relación entre dos posiciones en el árbol del documento durante la navegación — None, Inside, StartEnd, Sibling, Above o Below.
¿Cómo difiere esto de las API de manipulación de árboles en la página Nodos?
El Nodes La página cubre la inserción, eliminación, clonación y reorganización de nodos. Esta página cubre el recorrido de solo lectura y la ubicación dentro de un árbol que ya existe.
Resumen de API Reference
| Clase / Enumeración | Descripción |
|---|---|
NodeEnumerator | implementación de IEnumerator<Node> / IDocumentPositionListener detrás de la iteración foreach; Dispose(), Reset() |
DocumentPositionMovement | Enumeración de seis miembros que describe la posición relativa durante el recorrido (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Devuelve el enumerador de los hijos inmediatos de un nodo |