Navigation
Navigation
Aspose.Words FOSS a .NET számára tartalmaz egy kis Nodes.Navigation namespace az iteráláshoz és pozicionáláshoz a dokumentum csomópontfájában: NodeEnumerator, a enumerátor típus a for-each stílusú iteráció mögött a gyermekcsomópontok felett, és DocumentPositionMovement, egy enumeráció, amely leírja, hogyan viszonyul egy csomópont pozíciója egy másikéhoz a bejárás során. Ez különbözik a fa-manipulációs API-któl (beszúrás, eltávolítás és átrendezés), covered on the Nodes oldalon — ez az oldal a már létező fában való mozgást és a pozíciók összehasonlítását tárgyalja.
Gyermekcsomópontok iterálása
Bármely CompositeNode (a tárolócsomópontok, például Document, Section, Body és Paragraph alaposztálya) támogatja a fele-egy-stílusú iterálást az azonnali gyermekein keresztül a GetEnumerator() segítségével, amely – a dokumentációja szerint – támogatja a csomópont gyermekelemeinek fele-egy-stílusú iterálását. A visszaadott enumerátor megvalósítja a IEnumerator<Node> interfészt; ebben a API felületen ezt a szerepet a NodeEnumerator tölti be, amely emellett implementálja a IDocumentPositionListener interfészt is, hogy nyomon követhesse a pozícióváltozásokat, miközben az alatta lévő fa enumerálódik. A NodeEnumerator a szokásos Dispose() és Reset() tagokat is elérhetővé teszi a IEnumerator<Node> szerződés mellett.
Dokumentumpozíció mozgatása
DocumentPositionMovement egy hat tagú felsorolás — None, Inside, StartEnd, Sibling, Above és Below — amely azt ábrázolja, hogyan viszonyul egy dokumentumon belüli pozíció egy másikhoz a fa navigálása során: legyen az változatlan, egy csomópontba áthelyezve, egy kezdő/vég határhoz mozgatva, egy testvércsomóponthoz, vagy a referencia-pozíció fölé vagy alá. Ez a NodeEnumerator mellett van definiálva ugyanabban a Nodes.Navigation területen a API felületen, tükrözve szerepét a pozícióváltozások nyomon követésében az enumerálás közben.
Tippek és bevált gyakorlatok
- Használjon egy szabványos C#
foreachbármelyCompositeNodefelett (vagy hívja meg közvetlenül aGetEnumerator()-t), hogy bejárja egy csomópont azonnali gyermekeit — az enumerátor kezeli Ön helyett aIEnumerator<Node>szerződést. - Mivel a
NodeEnumeratoris megvalósítja aIDocumentPositionListener-t, kerüld el az enumerátor gyorsítótárazását a fa szerkezeti módosításai között; szerezd vissza újra aGetEnumerator()segítségével, ha a bejárni kívánt csomópontgyűjtemény megváltozott. - Mélyebb fa bejárásokhoz (nem csak az azonnali gyermekek) használja a
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode)kombinációt, vagy aGetChildNodes(nodeType, isDeep)-t, ahol aisDeeptrue-re van állítva, ahelyett, hogy manuálisan egymásba ágyazná az enumerátorokat.
Gyakori problémák
| Probléma | Oka | Javítás |
|---|---|---|
| A csomópont gyermekelemeinek felsorolása közben azok módosítása kivételt eredményez vagy kihagyja a csomópontokat | A fa szerkezetileg megváltozott a felsorolás során | Először gyűjtsd össze a csomópontokat egy tömbbe (például a NodeCollection.ToArray() segítségével), majd iteráld a tömböt a fa módosítása közben |
| Nem vagyok biztos benne, hogy a áthelyezett pozíció hogyan viszonyul az eredetihez | A DocumentPositionMovement értékek nem lettek ellenőrizve | Ellenőrizd a jelentett DocumentPositionMovement-t (Inside, StartEnd, Sibling, Above, Below vagy None) ahelyett, hogy konkrét kapcsolatot feltételeznél |
FAQ
Kell-e közvetlenül a NodeEnumerator használni?
Általában nem — egy szabványos C# foreach egy CompositeNode felett implicit módon használja a GetEnumerator() segítségével. Csak akkor nyúlj hozzá közvetlenül, ha explicit vezérlésre van szükség a Dispose()/Reset() felett.
Mit ír le a DocumentPositionMovement?
A dokumentumfa két pozíciója közötti kapcsolat a navigáció során — None, Inside, StartEnd, Sibling, Above vagy Below.
Miben különbözik ez a Nodes oldalán található fa-manipulációs API-któl?
A Nodes Az oldal lefedi a csomópontok beszúrását, eltávolítását, klónozását és újraszervezését. Ez az oldal a már létező fa csak olvasásra szolgáló bejárását és pozicionálását taglalja.
API Reference összefoglaló
| Osztály / Enum | Leírás |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener megvalósítás a for-each iteráció mögött; Dispose(), Reset() |
DocumentPositionMovement | Hat tagú enum, amely a bejárás során a relatív pozíciót írja le (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Visszaadja a node közvetlen gyermekeinek enumerátorát |