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#
foreachna dowolnymCompositeNode(lub wywołajGetEnumerator()bezpośrednio), aby przejść przez bezpośrednie dzieci węzła — enumerator obsługuje kontraktIEnumerator<Node>za Ciebie. - Ponieważ
NodeEnumeratorrównież implementujeIDocumentPositionListener, 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)lubGetChildNodes(nodeType, isDeep)z ustawionymisDeepnatrue, zamiast ręcznego zagnieżdżania enumeratorów.
Typowe problemy
| Problem | Przyczyna | Naprawa |
|---|---|---|
| Iterowanie po dzieciach węzła podczas ich modyfikacji powoduje rzucanie wyjątków lub pomijanie węzłów | Drzewo zostało strukturalnie zmienione podczas enumeracji | Najpierw 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 pierwotnej | Wartości DocumentPositionMovement nie zostały sprawdzone | Sprawdź 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 / Enum | Opis |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementacja stojąca za iteracją for-each; Dispose(), Reset() |
DocumentPositionMovement | Enum 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 |