Navigation

Navigation

Aspose.Words FOSS für .NET beinhaltet ein kleines Nodes.Navigation Namensraum für das Durchlaufen und Positionieren innerhalb des Knotensbaums eines Dokuments: NodeEnumerator, der Aufzählertyp hinter der for-each-artigen Iteration über Kindknoten, und DocumentPositionMovement, eine Aufzählung, die beschreibt, wie die Position eines Knotens in Bezug auf einen anderen während der Traversierung steht. Dies unterscheidet sich von den Baum-Manipulations-APIs (Einfügen, Entfernen und Neuordnen von Knoten), die auf der Nodes Seite — diese Seite behandelt das Durchlaufen und Vergleichen von Positionen in einem bereits bestehenden Baum.


Durchlaufen von Kindknoten

Jede CompositeNode (die Basisklasse für Containerknoten wie Document, Section, Body und Paragraph) unterstützt die for-each-Stil-Iteration über ihre unmittelbaren Kinder über GetEnumerator(), die – laut ihrer Dokumentation – Unterstützung für die for-each-Stil-Iteration über die Kindknoten eines Knotens bietet. Der zurückgegebene Aufzähler implementiert IEnumerator<Node>; in dieser API-Oberfläche wird diese Rolle von NodeEnumerator übernommen, die ebenfalls IDocumentPositionListener implementiert, damit sie Positionsänderungen verfolgen kann, während der zugrunde liegende Baum enumeriert wird. NodeEnumerator stellt die Standardmitglieder Dispose() und Reset() neben dem IEnumerator<Node>-Vertrag bereit.


Bewegung der Dokumentposition

DocumentPositionMovement ist eine Aufzählung mit sechs Mitgliedern — None, Inside, StartEnd, Sibling, Above und Below — die darstellen, wie sich eine Position im Dokument im Verhältnis zu einer anderen verhält, während der Baum navigiert wird: ob sie unverändert bleibt, in einen Knoten verschoben wird, zu einer Start-/Endgrenze verschoben wird, zu einem Geschwisterknoten verschoben wird oder über bzw. unter der Referenzposition liegt. Sie ist zusammen mit NodeEnumerator im selben Nodes.Navigation-Bereich der API-Oberfläche definiert und spiegelt ihre Rolle beim Verfolgen von Positionsänderungen während der Enumeration wider.


Tipps und bewährte Verfahren

  • Verwenden Sie einen Standard C# foreach über jedem CompositeNode (oder rufen Sie GetEnumerator() direkt auf), um die unmittelbaren Kinder eines Knotens zu durchlaufen — der Enumerator übernimmt den IEnumerator<Node>-Vertrag für Sie.
  • Da NodeEnumerator auch IDocumentPositionListener implementiert, vermeiden Sie das Zwischenspeichern eines Enumerators über strukturelle Änderungen am Baum hinweg; holen Sie ihn über GetEnumerator() erneut, falls sich die Knotensammlung, die Sie iterieren, geändert hat.
  • Für tiefe Baumdurchläufe (nicht nur unmittelbare Kinder) verwenden Sie Node.NextPreOrder(rootNode) / PreviousPreOrder(rootNode) oder GetChildNodes(nodeType, isDeep) mit isDeep auf true gesetzt, anstatt Enumeratoren manuell zu schachteln.

Häufige Probleme

ProblemUrsacheLösung
Das Aufzählen der Kinder eines Knotens während ihrer Modifikation wirft Ausnahmen oder überspringt KnotenDer Baum wurde während der Aufzählung strukturell verändertSammeln Sie die Knoten zunächst in ein Array (zum Beispiel mit NodeCollection.ToArray()), dann iterieren Sie das Array, während Sie den Baum modifizieren
Unsicher, wie sich eine verschobene Position zur ursprünglichen verhältDocumentPositionMovement-Werte wurden nicht geprüftÜberprüfen Sie das gemeldete DocumentPositionMovement (Inside, StartEnd, Sibling, Above, Below oder None), anstatt eine spezifische Beziehung anzunehmen

FAQ

Muss ich NodeEnumerator direkt verwenden?

In der Regel nicht — ein Standard C# foreach über einem CompositeNode verwendet ihn implizit über GetEnumerator(). Greifen Sie direkt darauf nur zu, wenn Sie explizite Kontrolle über Dispose()/Reset() benötigen.

Was beschreibt DocumentPositionMovement?

Die Beziehung zwischen zwei Positionen im Dokumentbaum während der Navigation — None, Inside, StartEnd, Sibling, Above oder Below.

Wie unterscheidet sich das von den Baummanipulations-APIs auf der Nodes-Seite?

Der Nodes Die Seite behandelt das Einfügen, Entfernen, Klonen und Umorganisieren von Knoten. Diese Seite behandelt die reine Lese-Durchquerung und Positionierung innerhalb eines bereits bestehenden Baums.


API Reference Zusammenfassung

Klasse / EnumBeschreibung
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener Implementierung hinter der for-each-Iteration; Dispose(), Reset()
DocumentPositionMovementSechs-Element-Enum, das die relative Position während der Traversierung beschreibt (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()Gibt den Enumerator für die unmittelbaren Kinder eines Knotens zurück

Siehe auch

 Deutsch