Aspose.Words Document Object Model (DOM)

El Aspose.Words Document Object Model (G)DOM) es una representación en memoria de un documento de Word. El Aspose.Words DOM le permite leer, manipular y modificar programáticamente el contenido y formato de un documento de Word.

Esta sección describe las principales clases de Aspose.Words DOM y sus relaciones. Usando el Aspose.Words DOM clases, puede obtener acceso programático a elementos de documento y formato.

Crear documento Árbol de objetos

Cuando se lee un documento Aspose.Words <span notrans="<span notrans=" DOM"="">," entonces se construye un árbol de objetos y diferentes tipos de elementos del documento fuente tienen su propio DOM objetos de árboles con varias propiedades.

Build Document Nodes Tree

Cuando Aspose.Words lee un documento de Word en memoria, crea objetos de diferentes tipos que representan varios elementos de documentos. Cada trama de un texto, párrafo, tabla o sección es un nodo, e incluso el documento mismo es un nodo. Aspose.Words define una clase para cada tipo de nodo de documento.

El árbol de documentos en Aspose.Words sigue el patrón de diseño compuesto:

  • Todas las clases de nodos se derivan finalmente de la Node clase, que es la clase base en la Aspose.Words Document Object Model.
  • Nodos que pueden contener otros nodos, por ejemplo, Section o Paragraph, derivado del CompositeNode clase, que a su vez deriva de la Node clase.

El diagrama que figura a continuación muestra la herencia entre las clases de nodos Aspose.Words Document Object Model (G)DOM). Los nombres de las clases abstractas están en Italics.

aspose-words-dom

Veamos un ejemplo. La siguiente imagen muestra una Microsoft Word documento con diferentes tipos de contenido.

document-example

Al leer el documento anterior en el Aspose.Words DOM, el árbol de objetos se crea, como se muestra en el esquema de abajo.

document-example-dom

Document, Section, Paragraph, Table, Shape, Run, y todos los demás elipses en el diagrama son Aspose.Words objetos que representan elementos del documento de Word.

Consigue un Node Tipo

Aunque el Node la clase es suficiente para distinguir diferentes nodos entre sí, Aspose.Words proporciona el NodeType enumeración para simplificar algunos API tareas, como seleccionar los nodos de un tipo específico.

El tipo de cada nodo se puede obtener utilizando el NodeType propiedad. Esta propiedad devuelve a NodeType Valor de enumeración. Por ejemplo, un nodo del párrafo representado por el Paragraph retornos de clase NodeType.Paragraph, y un nodo de mesa representado por Table retornos de clase NodeType.Table.

El siguiente ejemplo muestra cómo conseguir un tipo de nodo usando el NodeType enumeración:

Document Tree Navigation

Aspose.Words representa un documento como un árbol de nodos, que le permite navegar entre los nodos. Esta sección describe cómo explorar y navegar el árbol de documentos en Aspose.Words.

Cuando abre el documento de la muestra, presentado anteriormente, en el Explorador del documento, el árbol del nodo aparece exactamente como está representado en Aspose.Words.

document-in-document-explorer

Relación de los ganglios

Los nudos del árbol tienen relaciones entre ellos:

  • Un nodo que contiene otro nodo es un parent.
  • El nodo contenido en el nodo padre es un child. Nodos infantiles del mismo padre son sibling nodos.
  • El root el nodo es siempre Document Nodo.

Los nodos que pueden contener otros nodos derivan de los CompositeNode clase, y todos los nodos finalmente se derivan de Node clase. Estas dos clases base proporcionan métodos y propiedades comunes para la navegación y modificación de la estructura del árbol.

El siguiente diagrama de objetos UML muestra varios nodos del documento de muestra y sus relaciones entre sí a través de las propiedades padre, niño y hermano:

document-nodes-relationships

El documento es Node Owner

Un nodo siempre pertenece a un documento particular, incluso si ha sido creado o eliminado del árbol, porque estructuras vitales de documentos como estilos y listas se almacenan en los Document Nodo. Por ejemplo, no es posible tener un Paragraph sin un Document porque cada párrafo tiene un estilo asignado que se define globalmente para el documento. Esta regla se utiliza cuando se crean nuevos nodos. Agregar un nuevo Paragraph directamente al DOM requiere un objeto de documento pasado al constructor.

Al crear un nuevo párrafo utilizando DocumentBuilder, el constructor siempre tiene un Document clase vinculada a ella a través de DocumentBuilder.Document propiedad.

El siguiente ejemplo de código muestra que al crear cualquier nodo, siempre se define un documento que poseerá el nodo:

Parent Node

Cada nodo tiene un padre especificado por el ParentNode propiedad. Un nodo no tiene padre nodo, es decir, ParentNode es nulo, en los siguientes casos:

  • El nodo acaba de ser creado y aún no se ha añadido al árbol.
  • El nodo ha sido quitado del árbol.
  • Esta es la raíz Document nodo que siempre tiene un nulo padre nodo.

Usted puede quitar un nodo de su padre llamando al Remove método. El siguiente ejemplo de código muestra cómo acceder al nodo padre:

Nodos infantiles

La forma más eficiente de acceder a los ganglios infantiles CompositeNode es a través de FirstChild y LastChild propiedades que devuelven los primeros y últimos ganglios infantiles, respectivamente. Si no hay ganglios infantiles, estas propiedades regresan null.

CompositeNode también proporciona el ChildNodes colección que permite el acceso indexado o enumerado a los nodos infantiles. El ChildNodes propiedad es una colección en vivo de nodos, lo que significa que cada vez que se cambia el documento, como cuando se eliminan o agregan los nodos, ChildNodes la colección se actualiza automáticamente.

Si un nodo no tiene hijo, entonces el ChildNodes propiedad devuelve una colección vacía. Puedes comprobar si CompositeNode contiene ningún niño nodo usando HasChildNodes propiedad.

El siguiente ejemplo de código muestra cómo enumerar los ganglios infantiles inmediatos de un CompositeNode utilizando el enumerador proporcionado por el ChildNodes colección:

El siguiente ejemplo de código muestra cómo enumerar los ganglios infantiles inmediatos de un CompositeNode utilizando acceso indexado:

Nodos hermanos

Usted puede obtener el nodo que precede inmediatamente o sigue un nodo particular utilizando el PreviousSibling y NextSibling propiedades, respectivamente. Si un nodo es el último hijo de su padre, entonces el NextSibling propiedad null. Por el contrario, si el nodo es el primer hijo de su padre, el PreviousSibling propiedad null.

El siguiente ejemplo de código muestra cómo visitar eficientemente todos los ganglios infantiles directos e indirectos de un nodo compuesto:

Acceso a los Nodos de Niños y Padres

Hasta ahora hemos discutido las propiedades que devuelven uno de los tipos de base – Node o CompositeNode. Pero a veces hay situaciones en las que es posible que necesites lanzar valores a una clase específica de nodos, como Run o Paragraph. Es decir, no puedes alejarte completamente del casting cuando trabajas con el Aspose.Words DOM, que es composite.

Para reducir la necesidad de fundición, la mayoría Aspose.Words las clases proporcionan propiedades y colecciones que proporcionan un acceso de tipo fuerte. Hay tres patrones básicos de acceso tipo:

Las propiedades clasificadas son simplemente atajos útiles que a veces proporcionan un acceso más fácil que las propiedades genéricas heredadas de Node.ParentNode y CompositeNode.FirstChild.

El siguiente ejemplo de código muestra cómo utilizar propiedades tipodas para acceder a los nodos del árbol de documentos: