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# foreach nad libovolným CompositeNode (nebo zavolejte GetEnumerator() přímo), abyste prošli okamžité potomky uzlu — enumerátor pro vás řeší smlouvu IEnumerator<Node>.
  • Protože NodeEnumerator také implementuje IDocumentPositionListener, 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), nebo GetChildNodes(nodeType, isDeep) s nastaveným isDeep na true, místo ručního vnořování enumerátorů.

Časté problémy

ProblémPříčinaOprava
Procházení potomků uzlu při jejich úpravě vyvolává výjimky nebo přeskočí uzlyStrom 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 / EnumPopis:
NodeEnumeratorIEnumerator<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

Viz také:

 Čeština