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 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 задачи, такие как выбор узлов определенного типа.

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

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

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

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

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

document-in-document-explorer

Документальные отношения Node

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

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

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

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

document-nodes-relationships-aspose-words

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

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

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

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

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

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

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

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

Детские узлы

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

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

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

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

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

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

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

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

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

До сих пор мы обсуждали свойства, возвращающие один из базовых типов. 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.

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