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 jedemCompositeNode(oder rufen SieGetEnumerator()direkt auf), um die unmittelbaren Kinder eines Knotens zu durchlaufen — der Enumerator übernimmt denIEnumerator<Node>-Vertrag für Sie. - Da
NodeEnumeratorauchIDocumentPositionListenerimplementiert, vermeiden Sie das Zwischenspeichern eines Enumerators über strukturelle Änderungen am Baum hinweg; holen Sie ihn überGetEnumerator()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)oderGetChildNodes(nodeType, isDeep)mitisDeepauftruegesetzt, anstatt Enumeratoren manuell zu schachteln.
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Das Aufzählen der Kinder eines Knotens während ihrer Modifikation wirft Ausnahmen oder überspringt Knoten | Der Baum wurde während der Aufzählung strukturell verändert | Sammeln 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ält | DocumentPositionMovement-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 / Enum | Beschreibung |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener Implementierung hinter der for-each-Iteration; Dispose(), Reset() |
DocumentPositionMovement | Sechs-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 |