Aspose.Words Document Object Model (DOM)
На Aspose.Words Document Object Model (DOM) е в памет представяне на документ Word. На Aspose.Words DOM ви позволява да програмно четене, манипулация и промяна на съдържанието и форматиране на Word документ.
Този раздел описва основните класове на Aspose.Words DOM и техните връзки. С помощта на Aspose.Words DOM класове, можете да получите програмен достъп до документи елементи и форматиране.
Създаване на Document
Дърво на обекти
Когато документ се чете в Aspose.Words DOM тогава е построен обект дърво и различни видове елементи на източника документ имат своя собствена DOM дървесни обекти с различни свойства.
Изграждане на документни възли Дърво
Кога Aspose.Words чете документ на Word в паметта, създава обекти от различни типове, които представляват различни елементи на документа. Всеки запис на текст, параграф, таблица или раздел е възел и дори самият документ е възел. Aspose.Words определя клас за всеки тип документен възел.
Дървото на документа в Aspose.Words Следва модела Composite Design:
- Всички класове възел в крайна сметка произтичат от Node клас, който е базовият клас в Aspose.Words Document Object Model.
- Възли, които могат да съдържат други възли, например, Section или Paragraph, ен CompositeNode клас, който от своя страна произтича от Node Клас.
На диаграмата по-долу е показано наследството между класовете възли на Aspose.Words Document Object Model (DOM). Имената на абстрактните класове са в Италия.

Нека да разгледаме един пример. Следното изображение показва a Microsoft Word документ с различни видове съдържание.

При четене на горния документ в Aspose.Words DOM, дървото на обектите е създадено, както е показано в схемата по-долу.

Document, Section, Paragraph, Table, Shape, Run, и всички други елипси на диаграмата са Aspose.Words обекти, които представляват елементи от документа Word.
Вземи Node
Тип
Въпреки че Node Класът е достатъчен, за да различава различни възли един от друг, Aspose.Words осигурява NodeType изброяване за опростяване на някои API задачи, като например избор на възли от определен тип.
Видът на всеки възел може да бъде получен с помощта на Node.node_type собственост. Този имот връща a NodeType стойност на изброяването. Например, параграф възел, представен от Paragraph Връщане на класа NodeType.PARAGRAPH, и възел на масата, представен от Table Връщане на класа NodeType.TABLE.
Следният пример показва как да получите тип възел с помощта на NodeType Изброяване:
# 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 |
Навигация на дървото на документа
Aspose.Words представлява документ като дърво възел, който ви позволява да се движите между възлите. Този раздел описва как да изследвате и навигирате дървото на документа в Aspose.Words.
Когато отворите примерния документ, представен по-рано, в документ Explorer, дървото се появява точно както е представен в Aspose.Words.

Връзки с възлите на документа
Възлите на дървото имат връзки между тях:
- Възел, съдържащ друг възел е parent.
- Възелът, който се съдържа в родителския възел е child. Детските възли на същия родител са sibling Възли.
- На root Възелът винаги е Document Възел.
Възлите, които могат да съдържат други възли, произлизат от CompositeNode класа, и всички възли в крайна сметка произтичат от Node Клас. Тези два основни класа осигуряват общи методи и свойства за навигация и модификация на структурата на дървото.
Следната диаграма UML обект показва няколко възли на извадка документ и техните отношения един с друг чрез родител, дете, и брат свойства:

Документът е собственик на възел
Възелът винаги принадлежи към конкретен документ, дори ако е създаден или отстранен от дървото, тъй като жизненоважни структури като стилове и списъци се съхраняват в Document Възел. Например, не е възможно да имате Paragraph без Document защото всеки параграф има определен стил, който се определя глобално за документа. Това правило се използва при създаване на нови възли. Добавяне на нов Paragraph директно към DOM изисква документен обект, предаден на конструктора.
При създаване на нов параграф, използващ DocumentBuilder, Строителят винаги има Document клас, свързан с него чрез DocumentBuilder.document собственост.
Следният пример за код показва, че при създаването на какъвто и да е възел винаги се определя документ, който ще притежава възела:
# 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}") |
Родителски възел
Всеки възел има майка, посочена от parent_node собственост. Възелът няма родителски възел. parent_node е None, в следните случаи:
- Възелът току-що беше създаден и все още не е добавен към дървото.
- Възелът е изваден от дървото.
- Това е коренът. Document Възел, който винаги е без родителски възел.
Можете да премахнете възел от неговия родител като се обадите на Node.remove метод. Следният пример с код показва как да се влезе в базовия възел:
# 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}") |
Детски възли
Най-ефективният начин за достъп до детски възли на CompositeNode е през first_child както и last_child свойства, които връщат съответно първите и последните детски възли. Ако няма детски възли, тези свойства се връщат None.
CompositeNode и осигурява get_child_nodes събиране, позволяващо индексиран или изброен достъп до детските възли. На get_child_nodes метод връща жива колекция от възли, което означава, че когато документът се променя, като например когато възлите се отстраняват или добавят, get_child_nodes събирането се актуализира автоматично.
Ако възелът няма дете, тогава get_child_nodes метод връща празна колекция. Можете да проверите дали CompositeNode съдържа всякакви детски възли с помощта на has_child_nodes собственост.
Следният пример с код показва как да се изброят незабавните детски възли на a CompositeNode използване на числителя, предоставен от get_child_nodes събиране:
# 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) | |
Родови възли
Можете да получите възела, който непосредствено предхожда или следва определен възел с помощта на previous_sibling както и next_sibling свойства, съответно. Ако възелът е последното дете на своя родител, тогава next_sibling собствеността е None. Обратно, ако възелът е първото дете на неговия родител, previous_sibling собствеността е None.
Следният пример за код показва как ефективно да посетите всички преки и непреки детски възли на композитен възел:
# 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()) | |
Напечатан достъп до възли за деца и родители
Досега сме обсъждали свойствата, които връщат един от базовите типове. Node или CompositeNode. Но понякога има ситуации, в които може да се наложи да се хвърлят стойности към определен клас възел, като Run или Paragraph. Това означава, че не можете напълно да се измъкнете от кастинга, когато работите с Aspose.Words DOM, което е съставно.
За да се намали необходимостта от кастинг, повечето Aspose.Words класовете осигуряват свойства и колекции, които осигуряват силно напечатан достъп. Има три основни модела на типов достъп:
- Родителски възел напечатан Първо_XXX както и last_XXX имоти. Например, Document е first_section както и last_section имоти. По същия начин, Table има свойства като first_row, last_row, и други.
- Родителски възел разкрива напечатана колекция от детски възли, като Document.sections, Body.paragraphs, и други.
- Детски възел осигурява достъп до родителите си, като Run.parent_paragraph, Paragraph.parent_section, и други.
Типираните свойства са просто полезни преки пътища, които понякога осигуряват по-лесен достъп от общите свойства, наследени от Node.parent_node както и CompositeNode.first_child.
Следният пример за код показва как да се използват типирани свойства за достъп до възлите на дървото на документа:
# 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() | |