Aspose.Words Modèle d'objet de document (DOM)
Le modèle d’objet de document Aspose.Words (DOM) est une représentation en mémoire d’un document Word. Le Aspose.Words DOM vous permet de lire, manipuler et modifier par programmation le contenu et la mise en forme d’un document Word.
Cette section décrit les principales classes du Aspose.Words DOM et leurs relations. En utilisant les classes Aspose.Words DOM, vous pouvez obtenir un accès par programmation aux éléments et à la mise en forme du document.
Créer une Arborescence d’Objets de Document
Lorsqu’un document est lu dans le Aspose.Words DOM, une arborescence d’objets est construite et différents types d’éléments du document source ont leurs propres objets d’arborescence DOM avec diverses propriétés.
Construire l’Arborescence des Nœuds de Document
Lorsque Aspose.Words lit un document Word en mémoire, il crée des objets de différents types qui représentent divers éléments du document. Chaque série de texte, paragraphe, tableau ou section est un nœud, et même le document lui-même est un nœud. Aspose.Words définit une classe pour chaque type de nœud de document.
L’arborescence du document dans Aspose.Words suit le modèle de conception composite:
- Toutes les classes de nœuds dérivent finalement de la classe Node, qui est la classe de base du modèle d’objet de document Aspose.Words.
- Les nœuds qui peuvent contenir d’autres nœuds, par exemple Section ou Paragraph, dérivent de la classe CompositeNode, qui à son tour dérive de la classe Node.
Le diagramme fourni ci-dessous montre l’héritage entre les classes de nœuds du modèle d’objet de document Aspose.Words (DOM). Les noms des classes abstraites sont en italique.

Node
.
Regardons un exemple. L’image suivante montre un document Microsoft Word avec différents types de contenu.

Lors de la lecture du document ci-dessus dans le Aspose.Words DOM, l’arborescence des objets est créée, comme indiqué dans le schéma ci-dessous.

Document, Section, Paragraph, Table, Shape, Run, et toutes les autres ellipses du diagramme sont Aspose.Words objets qui représentent des éléments du document Word.
Obtenez un Node
de type
Bien que la classe Node soit suffisante pour distinguer différents nœuds les uns des autres, Aspose.Words fournit l’énumération NodeType pour simplifier certaines tâches API, telles que la sélection de nœuds d’un type spécifique.
Le type de chaque nœud peut être obtenu à l’aide de la propriété NodeType. Cette propriété renvoie une valeur d’énumération NodeType. Par exemple, un nœud de paragraphe représenté par la classe Paragraph renvoie NodeType.Paragraph et un nœud de table représenté par la classe Table renvoie NodeType.Table.
L’exemple suivant montre comment obtenir un type de nœud à l’aide de l’énumération 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(); |
Navigation dans l’Arborescence des Documents
Aspose.Words représente un document sous la forme d’une arborescence de nœuds, ce qui vous permet de naviguer entre les nœuds. Cette section décrit comment explorer et naviguer dans l’arborescence du document dans Aspose.Words.
Lorsque vous ouvrez l’exemple de document, présenté précédemment, dans l’Explorateur de documents, l’arborescence des nœuds apparaît exactement telle qu’elle est représentée dans Aspose.Words.

Relations de nœud de document
Les nœuds de l’arbre ont des relations entre eux:
- Un nœud contenant un autre nœud est un parent.
- Le nœud contenu dans le nœud parent est un child. Les nœuds enfants du même parent sont des nœuds sibling.
- Le nœud root est toujours le nœud Document.
Les nœuds qui peuvent contenir d’autres nœuds dérivent de la classe CompositeNode, et tous les nœuds dérivent finalement de la classe Node. Ces deux classes de base fournissent des méthodes et des propriétés communes pour la navigation et la modification de la structure arborescente.
Le diagramme d’objet UML suivant montre plusieurs nœuds de l’exemple de document et leurs relations les uns avec les autres via les propriétés parent, child et sibling:

Le Document est le propriétaire du nœud
Un nœud appartient toujours à un document particulier, même s’il vient d’être créé ou supprimé de l’arborescence, car des structures vitales à l’échelle du document telles que des styles et des listes sont stockées dans le nœud Document. Par exemple, il n’est pas possible d’avoir un Paragraph sans Document car chaque paragraphe a un style attribué qui est défini globalement pour le document. Cette règle est utilisée lors de la création de nouveaux nœuds. L’ajout d’un nouveau Paragraph directement au DOM nécessite un objet document transmis au constructeur.
Lors de la création d’un nouveau paragraphe à l’aide de DocumentBuilder, le générateur a toujours une classe Document qui lui est liée via la propriété DocumentBuilder.Document.
L’exemple de code suivant montre que lors de la création d’un nœud, un document qui possédera le nœud est toujours défini:
// 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)); |
Nœud Parent
Chaque nœud a un parent spécifié par la propriété ParentNode. Un nœud n’a pas de nœud parent, c’est-à-dire que ParentNode est null, dans les cas suivants:
- Le nœud vient d’être créé et n’a pas encore été ajouté à l’arborescence.
- Le nœud a été supprimé de l’arborescence.
- C’est le nœud racine Document qui a toujours un nœud parent nul.
Vous pouvez supprimer un nœud de son parent en appelant la méthode Remove.L’exemple de code suivant montre comment accéder au nœud parent:
// 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())); |
Nœuds Enfants
Le moyen le plus efficace d’accéder aux nœuds enfants d’un CompositeNode est via les propriétés FirstChild et LastChild qui renvoient respectivement les premier et dernier nœuds enfants. S’il n’y a pas de nœuds enfants, ces propriétés renvoient null.
CompositeNode
Si un nœud n’a pas d’enfant, la propriété ChildNodes renvoie une collection vide. Vous pouvez vérifier si le CompositeNode contient des nœuds enfants en utilisant la propriété HasChildNodes.
L’exemple de code suivant montre comment énumérer les nœuds enfants immédiats d’un CompositeNode
à l’aide de l’énumérateur fourni par la collection 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()); | |
} | |
} |
L’exemple de code suivant montre comment énumérer les nœuds enfants immédiats d’un CompositeNode
à l’aide d’un accès indexé:
// 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()); | |
} | |
} |
Nœuds Frères
Vous pouvez obtenir le nœud qui précède ou suit immédiatement un nœud particulier en utilisant les propriétés PreviousSibling et NextSibling, respectivement. Si un nœud est le dernier enfant de son parent, alors la propriété NextSibling est null. Inversement, si le nœud est le premier enfant de son parent, la propriété PreviousSibling est null.
L’exemple de code suivant montre comment visiter efficacement tous les nœuds enfants directs et indirects d’un nœud composite:
// 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); | |
} | |
} |
Accès typé aux Nœuds Enfants et Parents
Jusqu’à présent, nous avons discuté des propriétés qui renvoient l’un des types de base – Node ou CompositeNode. Mais parfois, il y a des situations où vous pourriez avoir besoin de convertir des valeurs en une classe de nœud spécifique, telle que Run ou Paragraph. C’est-à-dire que vous ne pouvez pas complètement vous éloigner du casting lorsque vous travaillez avec le Aspose.Words DOM, qui est composite.
Pour réduire le besoin de conversion, la plupart des classes Aspose.Words fournissent des propriétés et des collections qui fournissent un accès fortement typé. Il existe trois modèles de base d’accès typé:
- Un nœud parent expose les propriétés typées FirstXXX et LastXXX. Par exemple, le Document a les propriétés FirstSection et LastSection. De même, Table a des propriétés telles que FirstRow, LastRow et autres.
- Un nœud parent expose une collection typée de nœuds enfants, tels que Document.Sections, Body.Paragraphs et autres.
- Un nœud enfant fournit un accès typé à son parent, tel que Run.ParentParagraph, Paragraph.ParentSection et autres.
Les propriétés typées sont simplement des raccourcis utiles qui fournissent parfois un accès plus facile que les propriétés génériques héritées de Node.ParentNode et CompositeNode.FirstChild.
L’exemple de code suivant montre comment utiliser les propriétés typées pour accéder aux nœuds de l’arborescence du document:
// 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(); | |
} |