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ågon CompositeNode (eller anropa GetEnumerator() direkt) för att gå igenom en nods omedelbara barn — enumeratorn hanterar IEnumerator<Node>-kontraktet åt dig.
  • Eftersom NodeEnumerator också implementerar IDocumentPositionListener, undvik att cacha en enumerator över strukturella ändringar i trädet; hämta den på nytt via GetEnumerator() 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), eller GetChildNodes(nodeType, isDeep) med isDeep satt till true, snarare än att nästla enumeratorer manuellt.

Vanliga problem

ProblemOrsakÅtgärd
Att iterera över en nods barn medan man modifierar dem kastar ett fel eller hoppar över noderTrädet ändrades strukturellt under enumerationenSamla 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 ursprungligaDocumentPositionMovement värden inspekterades inteKontrollera 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 / EnumBeskrivning
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener implementation bakom for-each-iteration; Dispose(), Reset()
DocumentPositionMovementSexmedlemsenum som beskriver relativ position under traversering (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()Returnerar enumeratorn för en nods omedelbara barn

Se även

 Svenska