Navigation
Navigation
Aspose.Words FOSS pro .NET zahrnuje malý Nodes.Navigation jmenný prostor pro iteraci a umisťování v rámci stromu uzlů dokumentu: NodeEnumerator, typ enumerátoru stojící za iterací ve stylu for-each nad podřízenými uzly, a DocumentPositionMovement, výčtem popisujícím, jak se pozice jednoho uzlu vztahuje k jinému během průchodu. To se liší od API pro manipulaci se stromem (vkládání, odstraňování a reorganizace uzlů) popsaných na Nodes stránce— tato stránka se zabývá pohybem a porovnáváním pozic ve stromu, který již existuje.
Iterování podřízených uzlů
Jakýkoli CompositeNode (základní třída pro kontejnerové uzly jako Document, Section, Body a Paragraph) podporuje iteraci ve stylu for-each přes své přímé potomky pomocí GetEnumerator(), který — podle své dokumentace — poskytuje podporu pro iteraci ve stylu for-each přes podřízené uzly uzlu. Vrácený enumerátor implementuje IEnumerator<Node>; v tomto povrchu API tuto roli plní NodeEnumerator, který také implementuje IDocumentPositionListener, aby mohl sledovat změny pozice během enumerace podkladového stromu. NodeEnumerator vystavuje standardní členy Dispose() a Reset() spolu se smlouvou IEnumerator<Node>.
Pohyb pozice v dokumentu
DocumentPositionMovement je výčtový typ se šesti členy — None, Inside, StartEnd, Sibling, Above a Below — představující, jak jedna pozice v dokumentu souvisí s druhou při procházení stromu: zda zůstala beze změny, byla přesunuta dovnitř uzlu, přesunuta na počáteční/koncovou hranici, přesunuta k sourozenci nebo přesunuta nad či pod referenční pozici. Je definována spolu s NodeEnumerator ve stejné Nodes.Navigation oblasti povrchu API, což odráží její roli při sledování změn pozic během enumerace.
Tipy a osvědčené postupy
- Použijte standardní C#
foreachnad libovolnýmCompositeNode(nebo zavolejteGetEnumerator()přímo), abyste prošli okamžité potomky uzlu — enumerátor pro vás řeší smlouvuIEnumerator<Node>. - Protože
NodeEnumeratortaké implementujeIDocumentPositionListener, vyhněte se ukládání enumerátoru do cache napříč strukturovanými úpravami stromu; získejte jej znovu pomocíGetEnumerator(), pokud se kolekce uzlů, kterou iterujete, změnila. - Pro hluboké procházení stromu (nejen okamžité potomky) použijte
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), neboGetChildNodes(nodeType, isDeep)s nastavenýmisDeepnatrue, místo ručního vnořování enumerátorů.
Časté problémy
| Problém | Příčina | Oprava |
|---|---|---|
| Procházení potomků uzlu při jejich úpravě vyvolává výjimky nebo přeskočí uzly | Strom byl během enumerace strukturálně změněn. | Nejprve shromážděte uzly do pole (například pomocí NodeCollection.ToArray()), poté procházejte pole, zatímco upravujete strom. |
| Nejste si jisti, jak se přesunutá pozice vztahuje k původní. | DocumentPositionMovement hodnoty nebyly zkontrolovány. | Zkontrolujte nahlášený DocumentPositionMovement (Inside, StartEnd, Sibling, Above, Below nebo None) místo toho, abyste předpokládali konkrétní vztah. |
FAQ
Potřebuji používat NodeEnumerator přímo?
Obvykle ne — standardní C# foreach nad CompositeNode jej používá implicitně prostřednictvím GetEnumerator(). Použijte jej přímo jen tehdy, když potřebujete explicitní kontrolu nad Dispose()/Reset().
Co popisuje DocumentPositionMovement?
Vztah mezi dvěma pozicemi v dokumentovém stromu během navigace — None, Inside, StartEnd, Sibling, Above nebo Below.
Jak se to liší od API pro manipulaci se stromem na stránce Nodes?
Ten Nodes Stránka popisuje vkládání, odstraňování, klonování a reorganizaci uzlů. Tato stránka se zabývá pouze čtením a procházením a umisťováním v již existujícím stromu.
API Reference Shrnutí
| Třída / Enum | Popis: |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementace za iterací foreach; Dispose(), Reset() |
DocumentPositionMovement | Šestčlenný enum popisující relativní pozici během procházení (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Vrací enumerátor pro přímé potomky uzlu |