Navigation
Navigation
Aspose.Words FOSS para .NET inclui um pequeno Nodes.Navigation namespace para iterar e posicionar dentro da árvore de nós de um documento: NodeEnumerator, o tipo enumerador por trás da iteração estilo for-each sobre nós filhos, e DocumentPositionMovement, uma enumeração que descreve como a posição de um nó se relaciona a outro durante a travessia. Isso é distinto das APIs de manipulação de árvore (inserção, remoção e reorganização de nós) cobertas na Nodes página — esta página cobre a movimentação e comparação de posições em uma árvore que já existe.
Iterando Nós Filhos
Qualquer CompositeNode (a classe base para nós contêineres como Document, Section, Body e Paragraph) suporta iteração estilo for-each sobre seus filhos imediatos via GetEnumerator(), que — conforme sua documentação — fornece suporte ao estilo de iteração for-each sobre os nós filhos de um nó. O enumerador retornado implementa IEnumerator<Node>; nesta camada API, esse papel é preenchido por NodeEnumerator, que também implementa IDocumentPositionListener para que possa rastrear mudanças de posição enquanto a árvore subjacente está sendo enumerada. NodeEnumerator expõe os membros padrão Dispose() e Reset() ao lado do contrato IEnumerator<Node>.
Movimento de Posição no Documento
DocumentPositionMovement é uma enumeração com seis membros — None, Inside, StartEnd, Sibling, Above e Below — representando como uma posição no documento se relaciona com outra à medida que a árvore é percorrida: se permanece inalterada, movida para dentro de um nó, movida para um limite inicial/final, movida para um nó irmão, ou movida acima ou abaixo da posição de referência. Ela é definida ao lado de NodeEnumerator na mesma área Nodes.Navigation da camada API, refletindo seu papel no rastreamento de mudanças de posição durante a enumeração.
Dicas e Melhores Práticas
- Use um C#
foreachpadrão sobre qualquerCompositeNode(ou chameGetEnumerator()diretamente) para percorrer os filhos imediatos de um nó — o enumerador lida com o contratoIEnumerator<Node>para você. - Como
NodeEnumeratortambém implementaIDocumentPositionListener, evite armazenar em cache um enumerador durante edições estruturais na árvore; recupere-o novamente viaGetEnumerator()se a coleção de nós que você está iterando tiver sido alterada. - Para percursos profundos da árvore (não apenas filhos imediatos), use
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), ouGetChildNodes(nodeType, isDeep)comisDeepdefinido comotrue, em vez de aninhar enumeradores manualmente.
Problemas comuns
| Problema | Causa | Correção |
|---|---|---|
| Enumerar os filhos de um nó enquanto os modifica gera exceções ou pula nós | A árvore foi alterada estruturalmente durante a enumeração | Colete os nós em um array primeiro (por exemplo, com NodeCollection.ToArray()), depois itere o array enquanto modifica a árvore |
| Não tem certeza de como uma posição movida se relaciona com a original | Os valores de DocumentPositionMovement não foram inspecionados | Verifique o DocumentPositionMovement reportado (Inside, StartEnd, Sibling, Above, Below ou None) em vez de assumir um relacionamento específico |
FAQ
Preciso usar NodeEnumerator diretamente?
Normalmente não — o C# foreach padrão sobre um CompositeNode o utiliza implicitamente via GetEnumerator(). Recorra a ele diretamente apenas quando precisar de controle explícito sobre Dispose()/Reset().
O que DocumentPositionMovement descreve?
O relacionamento entre duas posições na árvore de documento durante a navegação — None, Inside, StartEnd, Sibling, Above ou Below.
Como isso difere das APIs de manipulação de árvore na página Nodes?
O Nodes A página cobre inserção, remoção, clonagem e reorganização de nós. Esta página cobre travessia somente leitura e posicionamento dentro de uma árvore que já existe.
API Reference Resumo
| Classe / Enum | Descrição |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementação por trás da iteração foreach; Dispose(), Reset() |
DocumentPositionMovement | Enum de seis membros descrevendo a posição relativa durante a travessia (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Retorna o enumerador para os filhos imediatos de um nó |