Navigation
Navigation
Aspose.Words FOSS voor .NET bevat een kleine Nodes.Navigation namespace voor itereren en positioneren binnen de knoopboom van een document: NodeEnumerator, het enumeratortype achter for-each-stijl iteratie over kindknooppunten, en DocumentPositionMovement, een enumeratie die beschrijft hoe de positie van één knoop zich verhoudt tot een andere tijdens traverseren. Dit is verschillend van de boom-manipulatie-API’s (invoegen, verwijderen en reorganiseren van knopen) die behandeld worden op de Nodes pagina — deze pagina behandelt het verplaatsen door en vergelijken van posities in een boom die al bestaat.
Itereren van kindknopen
Elke CompositeNode (de basisklasse voor containerknooppunten zoals Document, Section, Body en Paragraph) ondersteunt for-each-stijl iteratie over zijn directe kinderen via GetEnumerator(), die — volgens de documentatie — ondersteuning biedt voor de for-each-stijl iteratie over de kindknooppunten van een knoop. De geretourneerde enumerator implementeert IEnumerator<Node>; in deze API laag wordt die rol vervuld door NodeEnumerator, die ook IDocumentPositionListener implementeert zodat hij positie-veranderingen kan bijhouden terwijl de onderliggende boom wordt geënumereerd. NodeEnumerator exposeert de standaard Dispose() en Reset() leden naast het IEnumerator<Node> contract.
Documentpositieverplaatsing
DocumentPositionMovement is een enumeratie met zes leden — None, Inside, StartEnd, Sibling, Above en Below — die weergeven hoe één positie in het document zich verhoudt tot een andere terwijl de boom wordt genavigeerd: of deze onveranderd is, verplaatst naar binnen een knoop, verplaatst naar een begin/eind-grens, verplaatst naar een broer/zus, of verplaatst boven of onder de referentiepositie. Het wordt gedefinieerd naast NodeEnumerator in hetzelfde Nodes.Navigation gebied van de API laag, en weerspiegelt zijn rol bij het bijhouden van positie-veranderingen tijdens enumeratie.
Tips en best practices
- Gebruik een standaard C#
foreachover elkeCompositeNode(of roepGetEnumerator()direct aan) om de directe kinderen van een knoop te doorlopen — de enumerator handelt hetIEnumerator<Node>contract voor u af. - Omdat
NodeEnumeratorookIDocumentPositionListenerimplementeert, vermijd het cachen van een enumerator over structurele bewerkingen aan de boom; verkrijg deze opnieuw viaGetEnumerator()als de knoopverzameling die u doorloopt is veranderd. - Voor diepe boomtraversals (niet alleen directe kinderen), gebruik
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), ofGetChildNodes(nodeType, isDeep)metisDeepingesteld optrue, in plaats van enumerators handmatig te nesten.
Veelvoorkomende problemen
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| Het enumereren van de kinderen van een knoop terwijl je ze wijzigt, veroorzaakt fouten of slaat knopen over | De boom werd tijdens het enumereren structureel gewijzigd | Verzamel eerst de knopen in een array (bijvoorbeeld met NodeCollection.ToArray()), en loop vervolgens door de array terwijl je de boom wijzigt |
| Onzeker hoe een verplaatste positie zich verhoudt tot de oorspronkelijke | DocumentPositionMovement waarden werden niet geïnspecteerd | Controleer de gerapporteerde DocumentPositionMovement (Inside, StartEnd, Sibling, Above, Below of None) in plaats van een specifieke relatie aan te nemen |
FAQ
Moet ik NodeEnumerator direct gebruiken?
Niet meestal — een standaard C# foreach over een CompositeNode gebruikt het impliciet via GetEnumerator(). Gebruik het direct alleen wanneer je expliciete controle nodig hebt over Dispose()/Reset().
Wat beschrijft DocumentPositionMovement?
De relatie tussen twee posities in de documentboom tijdens navigatie — None, Inside, StartEnd, Sibling, Above of Below.
Hoe verschilt dit van de boom-manipulatie-API’s op de Nodes-pagina?
De Nodes de pagina behandelt het invoegen, verwijderen, klonen en reorganiseren van knopen. Deze pagina behandelt alleen-lezen doorlopen en positionering binnen een boom die al bestaat.
API Reference Samenvatting
| Klasse / Enum | Beschrijving |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementatie achter for-each-iteratie; Dispose(), Reset() |
DocumentPositionMovement | Zesleden-enum die de relatieve positie tijdens traversie beschrijft (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Retourneert de enumerator voor de directe kinderen van een knoop |