Aspose.Words Document Object Model (DOM)

The Aspose.Words Document Object Model ()DOM) является представлением в памяти документа Word. The Aspose.Words DOM Это позволяет программно читать, манипулировать и изменять содержание и форматирование документа Word.

В этом разделе описаны основные классы Aspose.Words DOM и их взаимоотношениях. Используя Aspose.Words DOM классы, можно получить программный доступ к элементам документа и форматированию.

Создать Document Предметы дерева

Когда документ прочитывается в Aspose.Words <p notrans="<p notrans=" DOM"="">

"> Затем строится объектное дерево и различные типы элементов исходного документа имеют свои собственные. DOM древесные объекты с различными свойствами.

Строим документальные узлы дерева

Когда Aspose.Words Считывает документ Word в память, создает объекты разного типа, представляющие различные элементы документа. Каждый запуск текста, абзаца, таблицы или раздела является узлом, и даже сам документ является узлом. Aspose.Words Определяет класс для каждого типа узла документа.

Дерево документов в Aspose.Words Далее следует шаблон композитного дизайна:

  • Все классы узлов в конечном итоге происходят от Node класс, который является базовым в Aspose.Words Document Object Model.
  • Узлы, которые могут содержать другие узлы, например, Section или Paragraph, Происходит из CompositeNode Класс, который, в свою очередь, происходит от Node класс.

На приведенной ниже диаграмме показано наследование между классами узлов Aspose.Words Document Object Model ()DOM). Названия абстрактных классов написаны курсивом.

aspose-words-dom

Давайте посмотрим на пример. Следующее изображение показывает Microsoft Word Документы с различными типами контента.

document-example-aspose-words

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

dom-aspose-words

Document, Section, Paragraph, Table, Shape, Run, и все остальные эллипсы на диаграмме являются Aspose.Words объекты, представляющие элементы документа Word.

Найди Node Тип

Хотя и Node класса достаточно, чтобы отличать разные узлы друг от друга; Aspose.Words обеспечивает NodeType Перечисление для упрощения некоторых API задачи, такие как выбор узлов определенного типа.

Тип каждого узла может быть получен с помощью Node.node_type собственность. Это свойство возвращает NodeType перечислительная стоимость. Например, узел абзаца, представленный Paragraph Класс возвращается NodeType.PARAGRAPH, и столовый узел, представленный Table Класс возвращается NodeType.TABLE.

Следующий пример показывает, как получить тип узла с помощью NodeType перечисление:

Навигация по дереву

Aspose.Words представляет собой документ в виде дерева узлов, что позволяет перемещаться между узлами. В этом разделе описывается, как исследовать и перемещаться по дереву документов. Aspose.Words.

Когда вы открываете образец документа, представленный ранее, в проводнике документа, дерево узла появляется точно так же, как оно представлено в документе. Aspose.Words.

document-in-document-explorer

Документальные узлы отношений

Узлы в дереве имеют отношения между собой:

  • Узел, содержащий другой узел, является parent.
  • Узел, содержащийся в родительском узле, является child. Детские узлы одного родителя sibling Узлы.
  • root Узел всегда является Document Узел.

Узлы, которые могут содержать другие узлы, происходят из CompositeNode класс, и все узлы в конечном счете происходят от Node класс. Эти два базовых класса обеспечивают общие методы и свойства для навигации и модификации структуры дерева.

Следующая диаграмма объектов UML показывает несколько узлов образца документа и их отношения друг к другу через родительские, детские и родственные свойства:

document-nodes-relationships-aspose-words

Документ является владельцем узла

Узел всегда принадлежит определенному документу, даже если он был только что создан или удален из дерева, потому что в нем хранятся жизненно важные структуры, такие как стили и списки. Document Узел. Например, невозможно иметь Paragraph без Document Каждый пункт имеет определенный стиль, который определяется во всем мире для документа. Это правило используется при создании любых новых узлов. Добавить новый Paragraph непосредственно в сторону DOM Требуется документ, переданный конструктору.

При создании нового абзаца с использованием DocumentBuilder, Строитель всегда имеет Document Класс, связанный с ним через DocumentBuilder.document собственность.

Следующий пример кода показывает, что при создании любого узла всегда определяется документ, который будет владеть узлом:

Родительский узел

У каждого узла есть родитель, указанный parent_node собственность. Узел не имеет родительского узла, то есть parent_node это None, в следующих случаях:

  • Узел только что был создан и еще не был добавлен к дереву.
  • Узел был удален с дерева.
  • Это корень Document Узел, который всегда имеет родительский узел.

Вы можете удалить узел от его родителя, позвонив Node.remove метод. Следующий пример кода показывает, как получить доступ к родительскому узлу:

Детские узлы

Наиболее эффективный способ доступа к детским узлам CompositeNode осуществляется через first_child и last_child Свойства, возвращающие первый и последний детские узлы соответственно. Если нет детских узлов, эти свойства возвращаются None.

CompositeNode также обеспечивает get_child_nodes сбор, позволяющий индексировать или перечислять доступ к узлам ребенка. The get_child_nodes метод возвращает живую коллекцию узлов, что означает, что всякий раз, когда документ изменяется, например, когда узлы удаляются или добавляются, Get_child_nodes Коллекция обновляется автоматически.

Если у узла нет ребенка, то Get_child_nodes Метод возвращает пустую коллекцию. Вы можете проверить, является ли CompositeNode содержит любые детские узлы, использующие has_child_nodes собственность.

Следующий пример кода показывает, как перечислить непосредственные узлы ребенка. CompositeNode используя числитель, предоставленный Get_child_nodes коллекция:

Родственные узлы

Вы можете получить узел, который непосредственно предшествует или следует за конкретным узлом, используя previous_sibling и next_sibling свойств соответственно. Если узел является последним ребенком своего родителя, то next_sibling собственность является None. Если же узел является первым ребенком своего родителя, то previous_sibling собственность является None.

Следующий пример кода показывает, как эффективно посещать все прямые и косвенные дочерние узлы композитного узла:

Типовой доступ к детским и родительским узлам

До сих пор мы обсуждали свойства, возвращающие один из базовых типов. Node или CompositeNode. Но иногда бывают ситуации, когда вам может потребоваться отбросить значения в определенный класс узлов, например: Run или Paragraph. То есть вы не можете полностью уйти от кастинга при работе с Aspose.Words DOM, который является составным.

Чтобы уменьшить потребность в литье, большинство Aspose.Words Классы предоставляют свойства и коллекции, которые обеспечивают строго типизированный доступ. Существует три основных шаблона типизированного доступа:

  • Родительский узел показывает типизированный Первый_XXXX и 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.

Следующий пример кода показывает, как использовать типизированные свойства для доступа к узлам дерева документов: