Aspose.Words Modelo De Objecto Do Documento (DOM)
O Aspose.Words Document Object Model (DOM) é uma representação na memória de um documento do Word. O Aspose.Words DOM permite ler, manipular e modificar programaticamente o conteúdo e a formatação de um documento do Word.
Esta secção descreve as principais classes do Aspose.Words DOM e as suas relações. Ao utilizar as classes Aspose.Words DOM, pode obter acesso programático aos elementos do documento e à formatação.
Criar Árvore De Objectos Do Documento
Quando um documento é lido no Aspose.Words DOM, então uma árvore de objetos é construída e diferentes tipos de elementos do documento de origem têm seus próprios objetos de árvore DOM com várias propriedades.
Construir Árvore De Nós Do Documento
Quando Aspose.Words lê um documento do Word na memória, ele cria objetos de diferentes tipos que representam vários elementos do documento. Cada execução de um texto, parágrafo, tabela ou seção é um nó, e até mesmo o próprio documento é um nó. Aspose.Words define uma classe para cada tipo de nó de Documento.
A árvore de documentos em Aspose.Words segue o padrão de desenho composto:
- Todas as classes de nós derivam, em última análise, da classe Node, que é a classe base no modelo de objeto de Documento Aspose.Words.
- Os nós que podem conter outros nós, por exemplo, Section ou Paragraph, derivam da classe CompositeNode, que por sua vez deriva da classe Node.
O diagrama fornecido abaixo mostra a herança entre as classes de nós do modelo de objeto de documento Aspose.Words (DOM). Os nomes das classes abstratas estão em itálico.
Node
.
Vejamos um exemplo. A imagem a seguir mostra um documento Microsoft Word com diferentes tipos de conteúdo.
Ao ler o documento acima no Aspose.Words DOM, A árvore de objetos é criada, conforme mostrado no esquema abaixo.
Document, Section, Paragraph, Table, Shape, Run, e todas as outras elipses no diagrama são Aspose.Words objetos que representam elementos do documento do Word.
Obter um Node
Tipo
Embora a classe Node seja suficiente para distinguir nós diferentes uns dos outros, Aspose.Words fornece a enumeração NodeType para simplificar algumas tarefas API, como selecionar nós de um tipo específico.
O tipo de cada nó pode ser obtido usando a propriedade NodeType. Esta propriedade retorna um NodeType enumeration value. For example, a paragraph node represented by the Paragraph class returns NodeType.Paragraph e um nó de tabela representado pelo Table class returns NodeType.Table.
O exemplo a seguir mostra como obter um tipo de nó usando a enumeração NodeType:
Navegação Na Árvore De Documentos
Aspose.Words representa um documento como uma árvore de nós, que permite navegar entre nós. Esta secção descreve como explorar e navegar na árvore de documentos em Aspose.Words.
Quando você abre o documento de amostra, apresentado anteriormente, no Document Explorer, a árvore de nós aparece exatamente como está representada em Aspose.Words.
Relações Do Nó Do Documento
Os nós da árvore têm relações entre eles:
- Um nó que contém outro nó é parent.
- O nó contido no nó pai é um child. Nós filhos do mesmo pai são sibling nós.
- O nó root é sempre o nó Document.
Os nós que podem conter outros nós derivam da classe CompositeNode e todos os nós derivam da classe Node. Estas duas classes base fornecem métodos e propriedades comuns para a navegação e modificação da estrutura em árvore.
O diagrama de objetos UML a seguir mostra vários nós do documento de amostra e suas relações entre si por meio das propriedades pai, filho e irmão:
O documento é proprietário do nó
Um nó sempre pertence a um documento específico, mesmo que tenha sido criado ou removido da árvore, porque estruturas vitais para todo o documento, como estilos e listas, são armazenadas no nó Document. Por exemplo, não é possível ter um Paragraph sem um Document porque cada parágrafo tem um estilo atribuído que é definido globalmente para o documento. Esta regra é usada ao criar novos nós. Adicionar um novo Paragraph diretamente ao DOM requer um objeto document passado para o construtor.
Ao criar um novo parágrafo usando DocumentBuilder, O Construtor sempre tem uma classe Document vinculada a ele por meio da propriedade DocumentBuilder.Document.
O exemplo de código a seguir mostra que, ao criar qualquer nó, um documento que possuirá o nó é sempre definido:
Nó Pai
Cada nó tem um pai especificado pela propriedade ParentNode. Um nó não tem nó pai, ou seja, ParentNode é nulo, nos seguintes casos:
- O nó acaba de ser criado e ainda não foi adicionado à árvore.
- O nó foi removido da árvore.
- Este é o nó raiz Document que sempre tem um nó pai nulo.
Você pode remover um nó de seu pai chamando o método Remove.O exemplo de código a seguir mostra como acessar o nó pai:
Nós Filhos
A maneira mais eficiente de acessar nós filhos de a CompositeNode é por meio das propriedades FirstChild e LastChild que retornam o primeiro e o último nós filhos, respectivamente. Se não houver nós filhos, essas propriedades retornarão null.
CompositeNode
Se um nó não tiver filho, a propriedade ChildNodes retornará uma coleção vazia. Você pode verificar se o CompositeNode contém quaisquer nós filhos usando a propriedade HasChildNodes.
O exemplo de código a seguir mostra como enumerar nós filhos imediatos de a CompositeNode
usando o enumerador fornecido pela coleção ChildNodes
:
O exemplo de código a seguir mostra como enumerar nós filhos imediatos de a CompositeNode
usando acesso indexado:
Nós Irmãos
Você pode obter o nó que imediatamente precede ou segue um nó específico usando as propriedades PreviousSibling e NextSibling, respectivamente. Se um nó for o último filho de seu pai, a propriedade NextSibling será null. Por outro lado, se o nó for o primeiro filho de seu pai, a propriedade PreviousSibling será null.
O exemplo de código a seguir mostra como visitar com eficiência todos os nós filhos diretos e indiretos de um nó composto:
Acesso digitado aos nós Filho e pai
Até agora, discutimos as propriedades que retornam um dos tipos de base – Node ou CompositeNode. Mas às vezes há situações em que você pode precisar converter valores para uma classe de nó específica, como Run ou Paragraph. Ou seja, você não pode se afastar completamente da conversão ao trabalhar com o Aspose.Words DOM, que é composto.
Para reduzir a necessidade de conversão, a maioria das classes Aspose.Words fornece propriedades e coleções que fornecem acesso fortemente tipado. Existem três padrões básicos de acesso digitado:
- Um nó pai expõe as propriedades FirstXXX e LastXXX tipadas. Por exemplo, o Document tem FirstSection e LastSection propriedades. Da mesma forma, Table tem propriedades como FirstRow, LastRow e outras.
- Um nó pai expõe uma coleção tipada de nós filhos, como Document.Sections, Body.Paragraphs e outros.
- Um nó filho fornece acesso digitado ao seu pai, como Run.ParentParagraph, Paragraph.ParentSection e outros.
As propriedades digitadas são apenas atalhos úteis que, por vezes, proporcionam um acesso mais fácil do que as propriedades genéricas herdadas de Node.ParentNode e CompositeNode.FirstChild.
O exemplo de código a seguir mostra como usar propriedades digitadas para acessar nós da árvore de documentos: