Aspose.Words Document Object Model (DOM)

De Aspose.Words Document Object Model (DOM) is een herinneringsrepresentatie van een Word-document. De Aspose.Words DOM Hiermee kunt u programmatisch de inhoud en opmaak van een Word-document lezen, manipuleren en wijzigen.

Dit deel beschrijft de belangrijkste klassen van de Aspose.Words DOM en hun relaties. Door het gebruik van de Aspose.Words DOM klassen, kunt u programmatische toegang tot document elementen en opmaak verkrijgen.

Aanmaken Document Objectenboom

Wanneer een document wordt gelezen in de Aspose.Words DOM dan wordt er een objectboom gebouwd en hebben verschillende soorten elementen van het brondocument hun eigen DOM boomobjecten met verschillende eigenschappen.

Documentnodesboom bouwen

Wanneer Aspose.Words leest een Word-document in het geheugen, het creëert objecten van verschillende soorten die verschillende documentelementen vertegenwoordigen. Elke run van een tekst, paragraaf, tabel, of een sectie is een knooppunt, en zelfs het document zelf is een knooppunt. Aspose.Words definieert een klasse voor elk documentnodetype.

De documentboom in Aspose.Words volgt het samengestelde ontwerppatroon:

  • Alle knooppuntklassen komen uiteindelijk voort uit de Node klasse, dat is de basisklasse in de Aspose.Words Document Object Model.
  • Knooppunten die andere knooppunten kunnen bevatten, bijvoorbeeld, Section of Paragraph, de CompositeNode klasse, die op zijn beurt voortvloeit uit de Node Klasse.

Het onderstaande diagram toont de erfenis tussen de knooppuntklassen van de Aspose.Words Document Object Model (DOM). De namen van abstracte klassen zijn in cursief.

aspose-words-dom

Laten we naar een voorbeeld kijken. De volgende afbeelding toont een Microsoft Word document met verschillende soorten inhoud.

document-example-aspose-words

Bij het lezen van het bovenstaande document in de Aspose.Words DOM, de boom van objecten is gemaakt, zoals getoond in het schema hieronder.

dom-aspose-words

Document, Section, Paragraph, Table, Shape, Run, en alle andere ellipsen op het diagram zijn Aspose.Words objecten die elementen van het Word-document weergeven.

Haal een Node Type

Hoewel de Node klasse is voldoende om verschillende knooppunten van elkaar te onderscheiden; Aspose.Words levert de NodeType Lijst ter vereenvoudiging van sommige API taken, zoals het selecteren van knooppunten van een specifiek type.

Het type van elke knoop kan worden verkregen met behulp van de Node.node_type eigendom. Deze eigenschap geeft een NodeType Waarde van de opsomming. Een paragraaf die bijvoorbeeld door de Paragraph klasse geeft terug NodeType.PARAGRAPH, en een tabel knooppunt vertegenwoordigd door de Table klasse geeft terug NodeType.TABLE.

Het volgende voorbeeld laat zien hoe je een knooppunt type met behulp van de NodeType Lijst:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
type = doc.node_type

Documentboomnavigatie

Aspose.Words vertegenwoordigt een document als een knooppunt boom, waarmee u kunt navigeren tussen knooppunten. Deze sectie beschrijft hoe u de documentboom kunt verkennen en navigeren in Aspose.Words.

Wanneer u het voorbeelddocument opent, dat eerder in de Document Explorer wordt getoond, verschijnt de knooppuntboom precies zoals deze is weergegeven in Aspose.Words.

document-in-document-explorer

Relaties tussen documentnodes

De knooppunten in de boom hebben relaties tussen hen:

  • Een knooppunt met een ander knooppunt is een parent.
  • Het knooppunt in het ouderknooppunt is een child. Kindknooppunten van dezelfde ouder zijn sibling knooppunten.
  • De root knooppunt is altijd de Document Node.

De knooppunten die andere knooppunten kunnen bevatten zijn afkomstig van de CompositeNode klasse, en alle knooppunten uiteindelijk afkomstig zijn van de Node Klasse. Deze twee basisklassen bieden gemeenschappelijke methoden en eigenschappen voor de navigatie en modificatie van de boomstructuur.

Het volgende UML object diagram toont verschillende knooppunten van het monster document en hun relaties met elkaar via de ouder, kind en broer eigenschappen:

document-nodes-relationships-aspose-words

Document is Node-eigenaar

Een knooppunt behoort altijd tot een bepaald document, zelfs als het net is gemaakt of verwijderd uit de boom, omdat vitale document-brede structuren zoals stijlen en lijsten worden opgeslagen in de Document Node. Het is bijvoorbeeld niet mogelijk om een Paragraph zonder een Document omdat elke alinea een toegewezen stijl heeft die wereldwijd voor het document wordt gedefinieerd. Deze regel wordt gebruikt bij het aanmaken van nieuwe nodes. Een nieuw toevoegen Paragraph rechtstreeks naar de DOM vereist een document object doorgegeven aan de constructeur.

Bij het aanmaken van een nieuwe paragraaf DocumentBuilder, de bouwer heeft altijd een Document klasse verbonden aan het via de DocumentBuilder.document eigendom.

Het volgende voorbeeld toont aan dat bij het aanmaken van een node, een document dat eigenaar van de node is altijd wordt gedefinieerd:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
# Creating a new node of any type requires a document passed into the constructor.
para = aw.Paragraph(doc)
# The new paragraph node does not yet have a parent.
print(f"Paragraph has no parent node: {para.parent_node == None}")
# But the paragraph node knows its document.
print(f"Both nodes' documents are the same: {para.document == doc}")
# The fact that a node always belongs to a document allows us to access and modify
# properties that reference the document-wide data, such as styles or lists.
para.paragraph_format.style_name = "Heading 1"
# Now add the paragraph to the main text of the first section.
doc.first_section.body.append_child(para)
# The paragraph node is now a child of the Body node.
print(f"Paragraph has a parent node: {para.parent_node != None}")

Ouderknooppunt

Elke knooppunt heeft een ouder gespecificeerd door de parent_node eigendom. Een knooppunt heeft geen oudernode, dat wil zeggen, parent_node is None, in de volgende gevallen:

  • Het knooppunt is zojuist aangemaakt en is nog niet aan de boom toegevoegd.
  • Het knooppunt is uit de boom verwijderd.
  • Dit is de root Document knooppunt dat altijd een Geen ouder knooppunt heeft.

U kunt een knooppunt verwijderen van de ouder door de Node.remove methode. Het volgende voorbeeld van code laat zien hoe toegang te krijgen tot het ouderknooppunt:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
# The section is the first child node of the document.
section = doc.first_child
# The section's parent node is the document.
print(f"Section parent is the document: {doc == section.parent_node}")

Kindknooppunten

De meest efficiënte manier om toegang te krijgen tot kinderknooppunten van een CompositeNode via de first_child en last_child eigenschappen die respectievelijk de eerste en laatste kindknooppunten teruggeven. Als er geen kindknopen zijn, keren deze eigenschappen terug None.

CompositeNode de get_child_nodes collectie die geïndexeerde of genummerde toegang tot de kinderknooppunten mogelijk maakt. De get_child_nodes methode geeft een levende verzameling van knooppunten, wat betekent dat wanneer het document wordt gewijzigd, zoals wanneer knooppunten worden verwijderd of toegevoegd, de get_child_nodes collectie wordt automatisch bijgewerkt.

Als een knooppunt geen kind heeft, dan de get_child_nodes methode geeft een lege verzameling. U kunt controleren of de CompositeNode bevat alle kindknooppunten met behulp van de has_child_nodes eigendom.

Het volgende voorbeeld van code laat zien hoe direct kind knooppunten van een CompositeNode gebruik makend van de door de get_child_nodes verzameling:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
paragraph = doc.get_child(aw.NodeType.PARAGRAPH, 0, True).as_paragraph()
children = paragraph.child_nodes
for child in children :
# A paragraph may contain children of various types such as runs, shapes, and others.
if child.node_type == aw.NodeType.RUN :
run = child.as_run()
print(run.text)

Verwante nodes

U kunt de knoop verkrijgen die onmiddellijk voorafgaat aan of een bepaald knooppunt volgt met behulp van de previous_sibling en next_sibling eigenschappen, respectievelijk. Als een knooppunt is het laatste kind van zijn ouder, dan de next_sibling eigenschap is None. Omgekeerd, als de knoop is het eerste kind van zijn ouder, de previous_sibling eigenschap is None.

Het volgende voorbeeld van code laat zien hoe je efficiënt alle directe en indirecte kindknooppunten van een samengesteld knooppunt kunt bezoeken:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
def test_recurse_all_nodes(self) :
doc = aw.Document(docs_base.my_dir + "Paragraphs.docx")
# Invoke the recursive function that will walk the tree.
self.traverse_all_nodes(doc)
# <summary>
# A simple function that will walk through all children of a specified node recursively
# and print the type of each node to the screen.
# </summary>
def traverse_all_nodes(self, parentNode) :
# This is the most efficient way to loop through immediate children of a node.
for childNode in parentNode.child_nodes :
print(aw.Node.node_type_to_string(childNode.node_type))
# Recurse into the node if it is a composite node.
if childNode.is_composite :
self.traverse_all_nodes(childNode.as_composite_node())

Getypte toegang tot kinder- en ouderknooppunten

Tot nu toe hebben we de eigenschappen besproken die een van de basistypen teruggeven. Node of CompositeNode. Maar soms zijn er situaties waarin je misschien waarden naar een specifieke knooppunt klasse, zoals Run of Paragraph. Dat wil zeggen, je kunt niet helemaal weg van casting bij het werken met de Aspose.Words DOM, Dat is samengesteld.

Om de behoefte aan gietgieten te verminderen, Aspose.Words klassen bieden eigenschappen en collecties die sterk getypte toegang bieden. Er zijn drie basispatronen van getypte toegang:

Getypte eigenschappen zijn slechts nuttige snelkoppelingen die soms gemakkelijker toegang bieden dan generieke eigenschappen die zijn geërfd van Node.parent_node en CompositeNode.first_child.

Het volgende voorbeeld van code laat zien hoe getypte eigenschappen gebruikt kunnen worden om toegang te krijgen tot knooppunten van de documentboom:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
section = doc.first_section
body = section.body
# Quick typed access to all Table child nodes contained in the Body.
tables = body.tables
for table in tables :
# Quick typed access to the first row of the table.
if table.first_row != None :
table.first_row.remove()
# Quick typed access to the last row of the table.
if table.last_row != None :
table.last_row.remove()