Navigation

Navigation

Aspose.Words FOSS dla .NET zawiera mały Nodes.Navigation przestrzeń nazw do iteracji i pozycjonowania w drzewie węzłów dokumentu: NodeEnumerator, typ wyliczeniowy stojący za iteracją w stylu for-each nad węzłami potomnymi, oraz DocumentPositionMovement, wyliczenie opisujące, jak pozycja jednego węzła odnosi się do innego podczas przeglądania. To różni się od interfejsów API manipulacji drzewem (wstawianie, usuwanie i reorganizacja węzłów) opisanych na Nodes stronie — ta strona opisuje przemieszczanie się i porównywanie pozycji w drzewie, które już istnieje.


Iterowanie węzłów potomnych

Każdy CompositeNode (klasa bazowa dla węzłów kontenerowych, takich jak Document, Section, Body i Paragraph) obsługuje iterację w stylu for-each nad swoimi bezpośrednimi dziećmi za pośrednictwem GetEnumerator(), który — zgodnie z dokumentacją — zapewnia wsparcie dla iteracji w stylu for-each nad węzłami potomnymi danego węzła. Zwrócony wylicznik implementuje IEnumerator<Node>; w tej warstwie API rolę tę pełni NodeEnumerator, który dodatkowo implementuje IDocumentPositionListener, aby móc śledzić zmiany pozycji podczas enumeracji drzewa bazowego. NodeEnumerator udostępnia standardowe członki Dispose() i Reset() wraz z kontraktem IEnumerator<Node>.


Ruch pozycji w dokumencie

DocumentPositionMovement jest wyliczeniem z sześcioma członkami — None, Inside, StartEnd, Sibling, Above i Below — które opisują, jak jedna pozycja w dokumencie odnosi się do drugiej podczas nawigacji po drzewie: czy jest niezmieniona, przeniesiona wewnątrz węzła, przeniesiona do granicy początkowej/końcowej, przeniesiona do rodzeństwa, lub przeniesiona powyżej lub poniżej pozycji odniesienia. Jest zdefiniowane razem z NodeEnumerator w tym samym obszarze Nodes.Navigation warstwy API, odzwierciedlając jego rolę w śledzeniu zmian pozycji podczas enumeracji.


Wskazówki i najlepsze praktyki

  • Użyj standardowego C# foreach na dowolnym CompositeNode (lub wywołaj GetEnumerator() bezpośrednio), aby przejść przez bezpośrednie dzieci węzła — enumerator obsługuje kontrakt IEnumerator<Node> za Ciebie.
  • Ponieważ NodeEnumerator również implementuje IDocumentPositionListener, unikaj buforowania enumeratora między strukturalnymi modyfikacjami drzewa; pobierz go ponownie za pomocą GetEnumerator(), jeśli kolekcja węzłów, którą iterujesz, uległa zmianie.
  • Do głębokich przejść drzewa (nie tylko bezpośrednich dzieci) użyj Node.NextPreOrder(rootNode) / PreviousPreOrder(rootNode) lub GetChildNodes(nodeType, isDeep) z ustawionym isDeep na true, zamiast ręcznego zagnieżdżania enumeratorów.

Typowe problemy

ProblemPrzyczynaNaprawa
Iterowanie po dzieciach węzła podczas ich modyfikacji powoduje rzucanie wyjątków lub pomijanie węzłówDrzewo zostało strukturalnie zmienione podczas enumeracjiNajpierw zbierz węzły do tablicy (na przykład przy użyciu NodeCollection.ToArray()), a następnie iteruj po tej tablicy, modyfikując drzewo
Nie jest jasne, jak przeniesiona pozycja odnosi się do pierwotnejWartości DocumentPositionMovement nie zostały sprawdzoneSprawdź zgłoszone DocumentPositionMovement (Inside, StartEnd, Sibling, Above, Below lub None) zamiast zakładać określony związek

FAQ

Czy muszę używać NodeEnumerator bezpośrednio?

Rzadko — standardowy C# foreach na CompositeNode używa go implicite poprzez GetEnumerator(). Sięgaj po niego bezpośrednio tylko wtedy, gdy potrzebujesz wyraźnej kontroli nad Dispose()/Reset().

Co opisuje DocumentPositionMovement?

Związek między dwoma pozycjami w drzewie dokumentu podczas nawigacji — None, Inside, StartEnd, Sibling, Above lub Below.

Czym się to różni od interfejsów API manipulacji drzewem na stronie Nodes?

Ten Nodes Strona opisuje wstawianie, usuwanie, klonowanie i reorganizację węzłów. Ta strona opisuje wyłącznie odczytowy przegląd i pozycjonowanie w drzewie, które już istnieje.


API Reference Podsumowanie

Klasa / EnumOpis
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener implementacja stojąca za iteracją for-each; Dispose(), Reset()
DocumentPositionMovementEnum sześciu członków opisujący względną pozycję podczas przeglądania (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()Zwraca enumerator bezpośrednich potomków węzła

Zobacz także

 Polski