Aspose.Words Model Obiect Document (DOM)
Modelul de obiect Document Aspose.Words (DOM) este o reprezentare în memorie a unui document Word. Aspose.Words DOM vă permite să citiți, să manipulați și să modificați în mod programatic conținutul și formatarea unui document Word.
Această secțiune descrie clasele principale ale Aspose.Words DOM și relațiile lor. Folosind clasele Aspose.Words DOM, puteți obține acces programatic la elementele documentului și formatare.
Creați un arbore de obiecte Document
Când un document este citit în Aspose.Words DOM, atunci este construit un arbore de obiecte și diferite tipuri de elemente ale documentului sursă au propriile lor obiecte de copac DOM cu proprietăți diferite.
Construiți Arborele Nodurilor Documentului
Când Aspose.Words citește un document Word în memorie, acesta creează obiecte de diferite tipuri care reprezintă diferite elemente ale documentului. Fiecare rulare a unui text, paragraf, tabel sau secțiune este un nod și chiar documentul în sine este un nod. Aspose.Words definește o clasă pentru fiecare tip de nod de document.
Arborele de documente din Aspose.Words urmează modelul de proiectare compozit:
- Toate clasele de noduri derivă în cele din urmă din clasa Node, care este clasa de bază din modelul obiectului Document Aspose.Words.
- Nodurile care pot conține alte noduri, de exemplu, Section sau Paragraph, derivă din clasa CompositeNode, care la rândul său derivă din clasa Node.
Diagrama furnizată mai jos arată moștenirea între clasele de noduri ale modelului de obiect Document Aspose.Words (DOM). Numele claselor abstracte sunt în italice.
Să ne uităm la un exemplu. Următoarea imagine prezintă un document Microsoft Word cu diferite tipuri de conținut.
Când citiți documentul de mai sus în Aspose.Words DOM, arborele obiectelor este creat, așa cum se arată în schema de mai jos.
Document, Section, Paragraph, Table, Shape, Run, și toate celelalte elipse din diagramă sunt obiecte Aspose.Words care reprezintă elemente ale documentului Word.
Obțineți un Node
Tip
Deși clasa Node este suficientă pentru a distinge diferite noduri unele de altele, Aspose.Words oferă enumerarea NodeType pentru a simplifica unele sarcini API, cum ar fi selectarea nodurilor de un anumit tip.
Tipul fiecărui nod poate fi obținut folosind proprietatea Node.node_type. Această proprietate returnează o valoare de enumerare NodeType. De exemplu, un nod de paragraf reprezentat de clasa Paragraph returnează NodeType.PARAGRAPH, iar un nod de tabel reprezentat de clasa Table returnează NodeType.TABLE.
Următorul exemplu arată cum să obțineți un tip de nod folosind enumerarea NodeType:
Document Tree Navigation
Aspose.Words reprezintă un document ca arbore de noduri, care vă permite să navigați între noduri. Această secțiune descrie modul de explorare și navigare a arborelui de documente în Aspose.Words.
Când deschideți documentul eșantion, prezentat anterior, în Document Explorer, arborele nodului apare exact așa cum este reprezentat în Aspose.Words.
Relații Noduri Document
Nodurile din copac au relații între ele:
- Un nod care conține un alt nod este un parent.
- Nodul conținut în nodul părinte este un child. nodurile copil ale aceluiași părinte sunt sibling noduri.
- Nodul root este întotdeauna nodul Document.
Nodurile care pot conține alte noduri derivă din clasa CompositeNode, iar toate nodurile derivă în cele din urmă din clasa Node. Aceste două clase de bază oferă metode și proprietăți comune pentru navigarea și modificarea structurii arborești.
Următoarea diagramă de obiecte UML prezintă mai multe noduri ale documentului eșantion și relațiile lor între ele prin proprietățile părinte, copil și frate:
Documentul este proprietarul nodului
Un nod aparține întotdeauna unui anumit document, chiar dacă tocmai a fost creat sau eliminat din copac, deoarece structurile vitale la nivelul întregului document, cum ar fi stilurile și listele, sunt stocate în nodul Document. De exemplu, nu este posibil să aveți un Paragraph fără un Document deoarece fiecare paragraf are un stil atribuit care este definit global pentru document. Această regulă este utilizată la crearea oricăror noduri noi. Adăugarea unui nou Paragraph Direct la DOM necesită un obiect document transmis constructorului.
Când creați un paragraf nou folosind DocumentBuilder, constructorul are întotdeauna o clasă Document legată de acesta prin proprietatea DocumentBuilder.document.
Următorul exemplu de cod arată că atunci când creați orice nod, un document care va deține nodul este întotdeauna definit:
Nodul Părinte
Fiecare nod are un părinte specificat de proprietatea parent_node. Un nod nu are nod părinte, adică parent_node este None, în următoarele cazuri:
- Nodul tocmai a fost creat și nu a fost încă adăugat la copac.
- Nodul a fost scos din copac.
- Acesta este nodul rădăcină Document care are întotdeauna un nod părinte None.
Puteți elimina un nod din părintele său apelând metoda Node.remove.Următorul exemplu de cod arată cum să accesați nodul părinte:
Noduri Copil
Cel mai eficient mod de a accesa nodurile copil ale unui CompositeNode este prin proprietățile first_child și last_child care returnează primul și ultimul nod copil, respectiv. Dacă nu există noduri copil, aceste proprietăți returnează None.
CompositeNode oferă, de asemenea, colecția get_child_nodes care permite accesul indexat sau enumerat la nodurile copil. Metoda get_child_nodes returnează o colecție live de noduri, ceea ce înseamnă că ori de câte ori documentul este modificat, cum ar fi atunci când nodurile sunt eliminate sau adăugate, colecția get_child_nodes este actualizată automat.
Dacă un nod nu are copil, atunci metoda get_child_nodes returnează o colecție goală. Puteți verifica dacă CompositeNode conține noduri copil folosind proprietatea has_child_nodes.
Următorul exemplu de cod arată cum să enumerați nodurile copil imediate ale unui CompositeNode folosind enumeratorul furnizat de colecția get_child_nodes:
Noduri De Frate
Puteți obține nodul care precede sau urmează imediat un anumit nod folosind proprietățile previous_sibling și, respectiv, next_sibling. Dacă un nod este ultimul copil al părintelui său, atunci proprietatea next_sibling este None. În schimb, dacă nodul este primul copil al părintelui său, proprietatea previous_sibling este None.
Următorul exemplu de cod arată cum să vizitați eficient toate nodurile copil directe și indirecte ale unui nod compus:
Acces tastat la nodurile copil și părinte
Până în prezent, am discutat despre proprietățile care returnează unul dintre tipurile de bază – Node sau CompositeNode. Dar uneori există situații în care ar putea fi necesar să aruncați valori într-o anumită clasă de noduri, cum ar fi Run sau Paragraph. Adică, nu puteți scăpa complet de turnare atunci când lucrați cu Aspose.Words DOM, care este compozit.
Pentru a reduce nevoia de turnare, majoritatea claselor Aspose.Words oferă proprietăți și colecții care oferă acces puternic tastat. Există trei modele de bază de acces tastat:
- Un nod părinte expune proprietățile tastate first_XXX și last_XXX. De exemplu, Document are first_section și last_section proprietăți. În mod similar, Table are proprietăți precum first_row, last_row și altele.
- Un nod părinte expune o colecție tipărită de noduri copil, cum ar fi Document.sections, Body.paragraphs și altele.
- Un nod copil oferă acces tastat la părintele său, cum ar fi Run.parent_paragraph, Paragraph.parent_section și altele.
Proprietățile tastate sunt doar scurtături utile care uneori oferă acces mai ușor decât proprietățile generice moștenite de la Node.parent_node și CompositeNode.first_child.
Următorul exemplu de cod arată cum să utilizați proprietățile tastate pentru a accesa nodurile arborelui de documente: