Navigation
Navigation
Aspose.Words FOSS för .NET inkluderar en liten Nodes.Navigation namespace för iterering och positionering inom ett dokuments nodträd: NodeEnumerator, den enumeratortyp som ligger bakom for-each-stil iterering över barnnoder, och DocumentPositionMovement, en uppräkning som beskriver hur en nods position förhåller sig till en annan under traversering. Detta är skilt från trädmanipulerings-API:erna (infogning, borttagning och omorganisering av noder) som behandlas på Nodes sida — den här sidan täcker att förflytta sig genom och jämföra positioner i ett träd som redan finns.
Iterering av barnnoder
Alla CompositeNode (bas-klassen för behållarnoder såsom Document, Section, Body och Paragraph) stödjer for-each-stil iterering över sina omedelbara barn via GetEnumerator(), som — enligt dess dokumentation — ger stöd för for-each-stil iterering över ett nods barnnoder. Den returnerade enumeratorn implementerar IEnumerator<Node>; i detta API-gränssnitt fyller NodeEnumerator den rollen, och den implementerar även IDocumentPositionListener så att den kan spåra positionsändringar medan det underliggande trädet enumereras. NodeEnumerator exponerar de standard Dispose() och Reset() medlemmarna tillsammans med IEnumerator<Node>-kontraktet.
Dokumentpositionsrörelse
DocumentPositionMovement är en uppräkning med sex medlemmar — None, Inside, StartEnd, Sibling, Above och Below — som representerar hur en position i dokumentet förhåller sig till en annan när trädet navigeras: om den är oförändrad, flyttad in i en nod, flyttad till en start-/slutgräns, flyttad till en syskonnod, eller flyttad ovanför eller under referenspositionen. Den definieras tillsammans med NodeEnumerator i samma Nodes.Navigation-område av API-ytan, vilket speglar dess roll i att spåra positionsförändringar under enumeration.
Tips och bästa praxis
- Använd en standard C#
foreachöver någonCompositeNode(eller anropaGetEnumerator()direkt) för att gå igenom en nods omedelbara barn — enumeratorn hanterarIEnumerator<Node>-kontraktet åt dig. - Eftersom
NodeEnumeratorockså implementerarIDocumentPositionListener, undvik att cacha en enumerator över strukturella ändringar i trädet; hämta den på nytt viaGetEnumerator()om nodsamlingen du itererar över har förändrats. - För djupa trädgenomgångar (inte bara omedelbara barn), använd
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), ellerGetChildNodes(nodeType, isDeep)medisDeepsatt tilltrue, snarare än att nästla enumeratorer manuellt.
Vanliga problem
| Problem | Orsak | Åtgärd |
|---|---|---|
| Att iterera över en nods barn medan man modifierar dem kastar ett fel eller hoppar över noder | Trädet ändrades strukturellt under enumerationen | Samla först noderna i en array (till exempel med NodeCollection.ToArray()), iterera sedan över arrayen samtidigt som du modifierar trädet |
| Osäker på hur en flyttad position förhåller sig till den ursprungliga | DocumentPositionMovement värden inspekterades inte | Kontrollera den rapporterade DocumentPositionMovement (Inside, StartEnd, Sibling, Above, Below eller None) istället för att anta ett specifikt förhållande |
FAQ
Behöver jag använda NodeEnumerator direkt?
Inte vanligtvis — standard C# foreach över en CompositeNode använder den implicit via GetEnumerator(). Använd den direkt endast när du behöver explicit kontroll över Dispose()/Reset().
Vad beskriver DocumentPositionMovement?
Relationen mellan två positioner i dokumentträdet under navigering — None, Inside, StartEnd, Sibling, Above eller Below.
Hur skiljer sig detta från trädmanipulerings-API:erna på sidan Nodes?
Den Nodes sidan behandlar infogning, borttagning, kloning och omorganisering av noder. Denna sida behandlar enbart läsningstraversering och positionering inom ett redan befintligt träd.
API Reference Sammanfattning
| Klass / Enum | Beskrivning |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementation bakom for-each-iteration; Dispose(), Reset() |
DocumentPositionMovement | Sexmedlemsenum som beskriver relativ position under traversering (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Returnerar enumeratorn för en nods omedelbara barn |