Hogyan dolgozzunk a csomópontokkal a .NET-ban

Hogyan dolgozzunk a csomópontokkal a .NET-ban

Ez az útmutató bemutatja, hogyan lehet bejárni, lekérdezni és módosítani egy Word dokumentum csomópontfáját közvetlenül a Aspose.Words FOSS a .NET, használva a Node and CompositeNode alaposztályokat, amelyek Document, Section, Paragraph, Table, és minden egyéb dokumentumelem ezen épül. Lefedi a keresés hatókörének meghatározását NodeType, programozott módon csomópontok hozzáadását és eltávolítását, a strukturális változásokra reagálást, és a használatot DocumentVisitor típus-alapú bejáráshoz.

Lépésről lépésre útmutató

1. lépés: A csomag telepítése

Aspose.Words FOSS for .NET még nem tesz közzé NuGet csomagot – építsd a könyvtárat forrásból. Klónozd a https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git repót, majd építsd a Aspose.Words.sln-t Release konfigurációban a .NET SDK-val, és hivatkozz a projektedben a keletkezett Aspose.Words assembly-re. A könyvtár a .NET Standard 2.0-ra céloz, így fut a .NET Framework 4.6.2+ és a .NET 6/8/10 környezeteken.


2. lépés: A szükséges osztályok importálása

Adj hozzá egy using Aspose.Words; direktívát – a Node, CompositeNode, NodeType, NodeCollection, NodeList, INodeChangingCallback és DocumentVisitor mind a Aspose.Words névtérben található, a Document mellett.


3. lépés: Ismerje meg a Node és a CompositeNode alaposztályokat

Minden objektum egy dokumentumfában az absztrakt Node osztályból származik, amely elérhetővé teszi a NodeType (azonosítja, milyen típusú csomópont), a ParentNode (a körülvevő CompositeNode), a Document (a tulajdonos dokumentum), valamint a PreviousSibling / NextSibling a szintazonos csomópontok közötti mozgáshoz. Ellenőrizze a Node.IsComposite-t, hogy megtudja, egy adott csomópont tartalmazhat-e gyermekeket, mielőtt átkonvertálná. A CompositeNode kiterjeszti a Node-t konténerelemekhez – a FirstChild, LastChild és Count leírják a közvetlen gyermekeket, a HasChildNodes pedig jelzi, hogy van-e bármelyik.


4. lépés: Gyermekek lekérdezése típus szerint

Hívja a CompositeNode.GetChildNodes(nodeType, isDeep)-t, hogy visszakapja a megadott NodeType összes gyermekét, a isDeep: true átadásával a teljes alafát keresve, nem csak a közvetlen gyermekeket, vagy a NodeType.Any-t, hogy minden csomóponttípust egyeztesen típustól függetlenül. A CompositeNode.GetChild(nodeType, index, isDeep) egyetlen egyező gyermeket ad vissza index szerint. Strukturális csomóponttípusok esetén (Document, Section, Body, Paragraph, Table, Row, Cell), beágyazott tartalomtípusok (Run, Shape, Comment), és mező-gépes típusok (FieldStart, FieldSeparator, FieldEnd, amelyek egy Word-mező határait és a futtatási adatfolyamban lévő kapcsoló szöveget jelölik), adja meg a konkrét NodeType értéket, amely meghatározza, mit keres.


5. lépés: XPath lekérdezések futtatása egy alafán

CompositeNode emellett megvalósítja a SelectNodes(xpath) és a SelectSingleNode(xpath) funkciókat XPath-alapú lekérdezésekhez az alafán, a találatokat NodeList-ként (vagy egyetlen Node) adja vissza. A CompositeNode.GetEnumerator() egyszerű foreach-t támogat a csomópont közvetlen gyermekei felett, ha egy XPath-lekérdezés több, mint amire a feladat szükségeltet.


6. lépés: Csomópontok hozzáadása, áthelyezése és eltávolítása

A fa módosításához hívja a AppendChild(newChild) vagy PrependChild(newChild) függvényt, hogy egy csomópontot a konténer gyermekei elejére vagy végére adjon hozzá, illetve a InsertBefore(newChild, refChild) vagy InsertAfter(newChild, refChild) függvényt, hogy egy meglévő gyermekhez viszonyítva szúrjon be. A RemoveChild(oldChild) egy gyermeket távolít el, a RemoveAllChildren() pedig egyszerre az összeset törli; a CompositeNode.IndexOf(child) jelzi egy gyermek pozícióját. Maga a Node esetén a Clone(isCloneChildren) lemásol egy csomópontot – opcionálisan a gyermekeivel együtt –, a Remove() pedig leválasztja a csomópontot a szülőjéről.


7. lépés: A csomópontok materializálása élő gyűjtemény módosítása előtt

Gyűjtemény módosítása közben, amikor egy foreach ciklus iterál rajta – legyen az NodeCollection vagy a GetChildNodes eredménye – hibát eredményez. Először hívd meg a ToArray() függvényt a gyűjteményen, hogy a csomópontokat egy rögzített tömbbe materializáld, majd iterálj ezen a tömbön, miközben a Remove() hívod, vagy más módosításokat végzel a fán.


8. lépés: Részfa beolvasása dokumentumsorrendben

Node.NextPreOrder(rootNode) és PreviousPreOrder(rootNode) a fát dokumentumsorrendben járja be, egy adott gyökércsomópont által határolva – gyakori módja annak, hogy egy egész részfát csomópontról csomópontra beolvassunk rekurzív bejárási kód írása nélkül.


9. lépés: Minden csomóponttípus feldolgozása a DocumentVisitor segítségével

A különböző csomóponttípusok strukturált feldolgozásához származtass le az absztrakt DocumentVisitor osztályból, és felülírd a Visit*Start / Visit*End metódusokat a fontos csomóponttípusokhoz – például VisitParagraphStart / VisitParagraphEnd, VisitSectionStart / VisitSectionEnd, VisitBodyStart / VisitBodyEnd – majd hívd meg a Node.Accept(visitor) függvényt a részfa gyökerén, hogy lefuttasd. Ez a szabványos minta a dokumentum exportálásához, átalakításához vagy vizsgálatához anélkül, hogy minden felhasználási esethez egyedi rekurzív bejárást írnál.


10. lépés: Reagálás más kódból származó szerkezeti változásokra

Implementáld a INodeChangingCallback funkciót, amikor a kódnak reagálnia kell más kód által végrehajtott beszúrásokra vagy eltávolításokra – beleértve a beépített műveleteket – nem csak a közvetlenül végzett változásokra. Az NodeInserting(args), NodeInserted(args), NodeRemoving(args) és NodeRemoved(args) metódusai egy-egy NodeChangingArgs objektumot kapnak, amely leírja az érintett Node-t, régi és új szülőjét, valamint a bekövetkezett NodeChangingAction-t (Insert vagy Remove).

Gyakori problémák és megoldások

Egy Node CompositeNode típusra való átkonvertálása invalid-cast hibát dob A csomópont levél típusú – például Run or FieldStart – amely nem tarthat gyermekeket. Ellenőrizze Node.IsComposite először, vagy használja NodeType a csomópont konténer típusú-e annak megerősítéséhez a konvertálás előtt.

GetChildNodes közvetlen gyermekeket ad vissza, ha az isDeep hamis isDeep maradt false (vagy elhagyható, ahol a túlterhelés alapértelmezett a sekélyre). Adja át isDeep: true to GetChildNodes() az egész részfa kereséséhez a közvetlen gyermekek helyett.

Gyűjtemény módosítása, miközben végigiterálunk rajta, hibát dob. Csomópontok lettek hozzáadva vagy eltávolítva egy foreach felett egy NodeCollection vagy az eredménye GetChildNodes. Hívja meg a ToArray() először a módosítandó csomópontok materializálásához, majd iteráljon azon a tömbön, miközben módosítja a fát.

Egy DocumentVisitor alosztály nem kerül meghívásra bizonyos tartalmak esetén A látogatót ezen keresztül hívták meg Accept() egy olyan csomóponton, amely valójában nem tartalmazza a cél tartalmat, vagy a megfelelő Visit* metódus nem lett felülírva. Hívja Accept() egy olyan ősön, amely tartalmazza a tartalmat, és felülírja az összes Visit*Start / Visit*End pár, amely a feldolgozott csomóponttípusokra vonatkozik.

Az INodeChangingCallback nem értesül egy változásról A callback csak a Document amelyhez regisztrálták. Erősítse meg, hogy a callback a megfelelő Document példányhoz van csatolva a változás bekövetkezése előtt, nem utána.

Gyakran Ismételt Kérdések

Mi a különbség a Node és a CompositeNode között?

Node az az alaposztály, amelyből minden dokumentumelem származik. CompositeNode kiterjeszti a Node-t olyan elemekhez, amelyek gyerekeket tartalmazhatnak (például Body, Paragraph és Table); levél elemek, mint a Run, közvetlenül a Node-ből származnak, és nem tarthatnak gyerekeket.

Hogyan találhatok meg egy dokumentumban egy adott típusú összes node-ot?

Hívd meg a CompositeNode.GetChildNodes(nodeType, isDeep)-t azon a node-on, amely a keresést gyökérként szolgál – gyakran maga a Document – átadva a cél NodeType-t és a isDeep: true-t, hogy az egész részfát keresse, nem csak a közvetlen gyermekeket.

Hogyan távolíthatok el biztonságosan node-okat iterálás közben?

Gyűjtsd először a eltávolítandó node-okat egy tömbbe – például a NodeCollection.ToArray() segítségével – majd iterálj azon a tömbön, és hívd meg a Remove()-t minden egyes node-on, ahelyett, hogy a foreach iterálása közben módosítanád az élő gyűjteményt.

Mik azok a FieldStart, FieldSeparator és FieldEnd node-ok?

Ezek NodeType értékek, amelyek a futtatási adatfolyamba beágyazott Word mező mechanikáját jelölik: a FieldStart és a FieldEnd kötik a mezőt, és a FieldSeparator elválasztja a mező kódját a jelenleg megjelenített eredménytől.

Hogyan dolgozom fel minden bekezdést, táblázatot és run-t a dokumentumban?

Származtassa a DocumentVisitor osztályt, felülírja a szükséges csomóponttípusokhoz a Visit*Start / Visit*End metódusokat, majd hívja meg a Accept(visitor)-t a Document (vagy bármely alfa-fa gyökér) objektumon a futtatáshoz.

Lásd még:

 Magyar