Aspose.Words Document Object Model (DOM)
Про нас Aspose.Words Document Object Model (Українська)DOM) – це незрівнянне представлення документа Word. Про нас Aspose.Words DOM дозволяє програмітично читати, маніпулювати та змінювати зміст та форматування документа Word.
Цей розділ описує основні класи Aspose.Words DOM і їх стосунки. За допомогою Aspose.Words DOM Ви можете отримати тематичний доступ до елементів та форматування документів.
Створити документ Об’єкт Дерево
Коли документ прочитаний в документі Aspose.Words DOM, > після того, як дерево об’єкта побудовано і різні типи елементів документа джерела мають власний DOM об’єкти дерева з різними властивостями.
Створити документ Nodes Tree
Коли 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). Назви абстрактних класів в Italics.

Node
клас.
Давайте подивимося на прикладі. Наступне зображення показує Microsoft Word документ з різними типами контенту.

Під час читання вищевказаного документа в Aspose.Words DOM, Дерево об’єктів створюється, як показано на схемі нижче.

Document, Section, Paragraph, Table, Shape, Run, і всі інші еліпси на схемі Aspose.Words об’єкти, що представляють елементи документа Word.
Отримати Node
Тип
Хоча Node клас досить достатньо виділити різні вузли один від одного, Aspose.Words забезпечує NodeType занурення для спрощення деяких API завдання, такі як вибір вузлів конкретного типу.
Тип кожного вузла можна отримати за допомогою NodeType майно. Ця нерухомість повертається 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-Java | |
Document doc = new Document(); | |
// Returns NodeType.Document | |
int type = doc.getNodeType(); |
Навігація дерева документів
Aspose.Words являє собою документ як дерево вершин, що дозволяє переміщатися між вузлами. Цей розділ описує, як вивчити і навігувати дерево документа в Aspose.Wordsй
Коли ви відкриєте документ про зразок, представлений раніше, в Document Explorer, дерево вершини з’являється точно так, як він представлений в Aspose.Wordsй

Документ Node Зв’язки
Вузли в дереві мають зв’язки між ними:
- вузол, що містить інший вузол, є parent.
- до Вуз, що міститься в материнській вершині, є child. Дитячі вузли одного батька sibling вершини.
- У root вузол завжди Document вузол.
Вузли, які можуть містити інші вузли, що зводять з CompositeNode клас, і всі вузли, в кінцевому рахунку, від Node клас. Ці два базові класи забезпечують загальні методи та властивості для навігації структури дерева та модифікації.
Наведені нижче діаграми об’єкта УМЛ показує кілька вузлів документа про зразок та їх зв’язків між собою за допомогою батьків, дитини та рухомих властивостей:

Документ Node Власник
Вуз завжди належить до певного документа, навіть якщо він був просто створений або вилучений з дерева, тому що життєво важливі структури, такі як стилі і списки зберігаються в 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-Java | |
// Open a file from disk. | |
Document doc = new Document(); | |
// Creating a new node of any type requires a document passed into the constructor. | |
Paragraph para = new Paragraph(doc); | |
// The new paragraph node does not yet have a parent. | |
System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null)); | |
// But the paragraph node knows its document. | |
System.out.println("Both nodes' documents are the same: " + (para.getDocument() == 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.getParagraphFormat().setStyleName("Heading 1"); | |
// Now add the paragraph to the main text of the first section. | |
doc.getFirstSection().getBody().appendChild(para); | |
// The paragraph node is now a child of the Body node. | |
System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null)); |
Парент Node
Кожна вершина має батьківщину, вказану ParentNode майно. вузол не має материнського вузла, тобто ParentNode нуль, в наступних випадках:
- до Вузол був створений і ще не додано до дерева.
- до Вуз було видалено з дерева.
- до Це корінь Document вузол, який завжди має нульовий материнський вузол.
Ви можете видалити вузол з свого батька, викликаючи Remove метод. Приклад коду показує, як отримати доступ до материнської вершини:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Create a new empty document. It has one section. | |
Document doc = new Document(); | |
// The section is the first child node of the document. | |
Node section = doc.getFirstChild(); | |
// The section's parent node is the document. | |
System.out.println("Section parent is the document: " + (doc == section.getParentNode())); |
Дитячі Ноди
Найефективніший спосіб доступу дитячих вузлів CompositeNode через FirstChild і LastChild властивості, які повертають перші і останні дочірні вузли, відповідно. Якщо відсутні дочірні вузли, ці властивості повертаються nullй
CompositeNode також надає ChildNodes збірка дозволяє індексувати або занурювати доступ до дочірньих вузлів. Про нас ChildNodes майно є живою колекцією вузлів, що означає, що коли документ змінюється, наприклад, коли вузли видаляються або додаються, ChildNodes автоматично оновлюється.
Якщо вузол не має дитини, то ChildNodes майно повертає порожній збір. Ви можете перевірити, чи є CompositeNode містить будь-які дочірні вершини з використанням HasChildNodes майно.
Приклад коду показує, як об’єднати безпосередні дочірні вершини дитини CompositeNode
за допомогою анумератора, що надається за рахунок ChildNodes
Колекція:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(dataDir + "Document.doc"); | |
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true); | |
NodeCollection children = paragraph.getChildNodes(); | |
for (Node child : (Iterable<Node>) children) { | |
// Paragraph may contain children of various types such as runs, shapes and so on. | |
if (child.getNodeType() == NodeType.RUN) { | |
// Say we found the node that we want, do something useful. | |
Run run = (Run) child; | |
System.out.println(run.getText()); | |
} | |
} |
Приклад коду показує, як об’єднати безпосередні дочірні вершини дитини CompositeNode
за допомогою індексованого доступу:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(dataDir + "Document.doc"); | |
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true); | |
NodeCollection children = paragraph.getChildNodes(); | |
for (int i = 0; i < children.getCount(); i++) { | |
Node child = children.get(i); | |
// Paragraph may contain children of various types such as runs, shapes and so on. | |
if (child.getNodeType() == NodeType.RUN) { | |
// Say we found the node that we want, do something useful. | |
Run run = (Run) child; | |
System.out.println(run.getText()); | |
} | |
} |
Сіблінг Ноди
Ви можете отримати вершину, який безпосередньо передує або слідувати конкретному вершині за допомогою вузла PreviousSibling і NextSibling властивості, відповідно. Якщо вершина остання дитина батька, то NextSibling Готель nullй Неперевершено, якщо вершина є першою дитиною свого батька, PreviousSibling Готель nullй
Приклад коду показує, як ефективно відвідувати всі прямі та непрямі дочірні вершини композитного вузла:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
public static void main(String[] args) throws Exception { | |
String dataDir = Utils.getSharedDataDir(ChildNodes.class) + "DocumentObjectModel/"; | |
recurseAllNodes(dataDir); | |
} | |
public static void recurseAllNodes(String dataDir) throws Exception { | |
// Open a document | |
Document doc = new Document(dataDir + "Node.RecurseAllNodes.doc"); | |
// Invoke the recursive function that will walk the tree. | |
traverseAllNodes(doc); | |
} | |
/** | |
* A simple function that will walk through all children of a specified node | |
* recursively and print the type of each node to the screen. | |
*/ | |
public static void traverseAllNodes(CompositeNode parentNode) throws Exception { | |
// This is the most efficient way to loop through immediate children of a node. | |
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) { | |
// Do some useful work. | |
System.out.println(Node.nodeTypeToString(childNode.getNodeType())); | |
// Recurse into the node if it is a composite node. | |
if (childNode.isComposite()) | |
traverseAllNodes((CompositeNode) childNode); | |
} | |
} |
Типовий доступ до дитини та батьківських нодів
Поки ми обговорювали властивості, які повертають одну з базових типів – Node або CompositeNodeй Але іноді виникають ситуації, де потрібно відлити значення до певного класу вершини, такі як Run або Paragraphй Це, ви не можете повністю відмовитися від лиття під час роботи з Aspose.Words DOM, який композитний.
Щоб зменшити потребу у лиття, більшість Aspose.Words Класи забезпечують властивості та колекції, які забезпечують високий доступ. Є три основні візерунки типу:
- Визначається материнська вершина FirstXXX і LastXXX властивості. Наприклад, Document має FirstSection і LastSection властивості. Аналогічно, Table має властивості, такі як FirstRow, LastRow, та інші.
- Паризька вершина виводить типову колекцію дочірніх вузлів, таких як Document.Sections, Body.Paragraphs, та інші.
- Дитина вершина забезпечує доступ до свого батька, таких як Run.ParentParagraph, Paragraph.ParentSection, та інші.
Вимірювані властивості є просто корисними ярликами, які іноді забезпечують легкий доступ, ніж загальні властивості, спадкоємні від Node.ParentNode і CompositeNode.FirstChildй
Приклад коду показує, як використовувати типовані властивості для вузлів доступу до дерева документа:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
// Quick typed access to the first child Section node of the Document. | |
Section section = doc.getFirstSection(); | |
// Quick typed access to the Body child node of the Section. | |
Body body = section.getBody(); | |
// Quick typed access to all Table child nodes contained in the Body. | |
TableCollection tables = body.getTables(); | |
for (Table table : tables) { | |
// Quick typed access to the first row of the table. | |
if (table.getFirstRow() != null) | |
table.getFirstRow().remove(); | |
// Quick typed access to the last row of the table. | |
if (table.getLastRow() != null) | |
table.getLastRow().remove(); | |
} |