Aspose.Words Dokumentobjektmodell (DOM)
Das Aspose.Words -Dokumentobjektmodell (DOM) ist eine speicherinterne Darstellung eines Word-Dokuments. Mit Aspose.Words DOM können Sie den Inhalt und die Formatierung eines Word-Dokuments programmgesteuert lesen, bearbeiten und ändern.
Dieser Abschnitt beschreibt die Hauptklassen der Aspose.Words DOM und ihre Beziehungen. Mithilfe der Aspose.Words DOM-Klassen können Sie programmgesteuerten Zugriff auf Dokumentelemente und Formatierungen erhalten.
Dokumentobjektbaum erstellen
Wenn ein Dokument in die Aspose.Words DOM eingelesen wird, wird ein Objektbaum erstellt und verschiedene Arten von Elementen des Quelldokuments haben ihre eigenen DOM Baumobjekte mit verschiedenen Eigenschaften.
Dokumentknotenbaum erstellen
Wenn Aspose.Words ein Word-Dokument in den Speicher liest, werden Objekte unterschiedlichen Typs erstellt, die verschiedene Dokumentelemente darstellen. Jeder Durchlauf eines Textes, Absatzes, einer Tabelle oder eines Abschnitts ist ein Knoten, und sogar das Dokument selbst ist ein Knoten. Aspose.Words definiert eine Klasse für jeden Dokumentknotentyp.
Der Dokumentbaum in Aspose.Words folgt dem zusammengesetzten Entwurfsmuster:
- Alle Knotenklassen leiten sich letztendlich von der Node -Klasse ab, die die Basisklasse im Aspose.Words -Dokumentobjektmodell ist.
- Knoten, die andere Knoten enthalten können, z. B. Section oder Paragraph, leiten sich von der Klasse CompositeNode ab, die wiederum von der Klasse Node abgeleitet ist.
Das folgende Diagramm zeigt die Vererbung zwischen Knotenklassen des Aspose.Words-Dokumentobjektmodells (DOM). Die Namen der abstrakten Klassen sind kursiv gedruckt.
Node
geerbt wurden.
Schauen wir uns ein Beispiel an. Das folgende Bild zeigt ein Microsoft Word-Dokument mit verschiedenen Inhaltstypen.
Beim Einlesen des obigen Dokuments in Aspose.Words DOM wird der Objektbaum erstellt, wie im folgenden Schema gezeigt.
Document, Section, Paragraph, Table, Shape, Run, und alle anderen Ellipsen im Diagramm sind Aspose.Words -Objekte, die Elemente des Word-Dokuments darstellen.
Holen Sie sich einen Node
Typ
Obwohl die Klasse Node ausreicht, um verschiedene Knoten voneinander zu unterscheiden, stellt Aspose.Words die NodeType -Aufzählung bereit, um einige API -Aufgaben zu vereinfachen, z. B. die Auswahl von Knoten eines bestimmten Typs.
Der Typ jedes Knotens kann mit der Eigenschaft NodeType ermittelt werden. Diese Eigenschaft gibt einen NodeType-Aufzählungswert zurück. Beispielsweise gibt ein Absatzknoten, der durch die Klasse Paragraph dargestellt wird, NodeType.Paragraph zurück, und ein Tabellenknoten, der durch die Klasse Table dargestellt wird, gibt NodeType.Table zurück.
Das folgende Beispiel zeigt, wie Sie einen Knotentyp mithilfe der NodeType-Aufzählung abrufen:
Dokumentenbaumnavigation
Aspose.Words stellt ein Dokument als Knotenbaum dar, mit dem Sie zwischen Knoten navigieren können. In diesem Abschnitt wird beschrieben, wie Sie den Dokumentbaum in Aspose.Words durchsuchen und navigieren.
Wenn Sie das zuvor dargestellte Beispieldokument im Dokument-Explorer öffnen, wird der Knotenbaum genau so angezeigt, wie er in Aspose.Words dargestellt ist.
Dokumentknotenbeziehungen
Die Knoten im Baum haben Beziehungen zwischen ihnen:
- Ein Knoten, der einen anderen Knoten enthält, ist eine parent.
- Der im übergeordneten Knoten enthaltene Knoten ist ein child. Untergeordneter Knoten desselben übergeordneten Knotens sind sibling Knoten.
- Der root -Knoten ist immer der Document -Knoten.
Die Knoten, die andere Knoten enthalten können, stammen von der Klasse CompositeNode, und alle Knoten stammen letztendlich von der Klasse Node. Diese beiden Basisklassen stellen gemeinsame Methoden und Eigenschaften für die Navigation und Änderung der Baumstruktur bereit.
Das folgende UML-Objektdiagramm zeigt mehrere Knoten des Beispieldokuments und ihre Beziehungen zueinander über die Eigenschaften parent, child und sibling:
Dokument ist Knotenbesitzer
Ein Knoten gehört immer zu einem bestimmten Dokument, auch wenn er gerade erstellt oder aus dem Baum entfernt wurde, da wichtige dokumentweite Strukturen wie Stile und Listen im Knoten Document gespeichert sind. Beispielsweise ist es nicht möglich, eine Paragraph ohne eine Document zu haben, da jedem Absatz ein Stil zugewiesen ist, der global für das Dokument definiert ist. Diese Regel wird beim Erstellen neuer Knoten verwendet. Das direkte Hinzufügen einer neuen Paragraph zu DOM erfordert ein Dokumentobjekt, das an den Konstruktor übergeben wird.
Beim Erstellen eines neuen Absatzes mit DocumentBuilder ist dem Builder immer eine Document -Klasse über die Eigenschaft DocumentBuilder.Document zugeordnet.
Das folgende Codebeispiel zeigt, dass beim Erstellen eines Knotens immer ein Dokument definiert wird, dem der Knoten gehört:
Elternknoten
Jeder Knoten hat ein übergeordnetes Element, das durch die Eigenschaft ParentNode angegeben wird. Ein Knoten hat in den folgenden Fällen keinen übergeordneten Knoten, dh ParentNode ist null:
- Der Knoten wurde gerade erstellt und noch nicht zum Baum hinzugefügt.
- Der Knoten wurde aus dem Baum entfernt.
- Dies ist der Stammknoten Document, der immer einen übergeordneten Nullknoten hat.
Sie können einen Knoten von seinem übergeordneten Knoten entfernen, indem Sie die Remove -Methode aufrufen.Das folgende Codebeispiel zeigt, wie auf den übergeordneten Knoten zugegriffen wird:
Childknoten
Der effizienteste Weg, auf untergeordnete Knoten von CompositeNode zuzugreifen, ist über die Eigenschaften FirstChild und LastChild, die den ersten bzw. den letzten untergeordneten Knoten zurückgeben. Wenn keine untergeordneten Knoten vorhanden sind, geben diese Eigenschaften null zurück.
CompositeNode
Wenn ein Knoten kein untergeordnetes Element hat, gibt die Eigenschaft ChildNodes eine leere Auflistung zurück. Mit der Eigenschaft HasChildNodes können Sie überprüfen, ob CompositeNode untergeordnete Knoten enthält.
Das folgende Codebeispiel zeigt, wie unmittelbare untergeordnete Knoten einer CompositeNode
mit dem von der ChildNodes
-Auflistung bereitgestellten Enumerator aufgelistet werden:
Das folgende Codebeispiel zeigt, wie unmittelbare untergeordnete Knoten einer CompositeNode
mit indiziertem Zugriff aufgelistet werden:
Geschwisterknoten
Sie können den Knoten erhalten, der einem bestimmten Knoten unmittelbar vorausgeht oder folgt, indem Sie die Eigenschaften PreviousSibling bzw. NextSibling verwenden. Wenn ein Knoten das letzte untergeordnete Element seines übergeordneten Knotens ist, ist die Eigenschaft NextSibling null. Umgekehrt, wenn der Knoten das erste Kind seines Elternteils ist, ist die PreviousSibling -Eigenschaft null.
Das folgende Codebeispiel zeigt, wie Sie alle direkten und indirekten untergeordneten Knoten eines zusammengesetzten Knotens effizient besuchen können:
Typisierter Zugriff auf untergeordnete und übergeordnete Knoten
Bisher haben wir die Eigenschaften besprochen, die einen der Basistypen zurückgeben – Node oder CompositeNode. Manchmal gibt es jedoch Situationen, in denen Sie möglicherweise Werte in eine bestimmte Knotenklasse umwandeln müssen, z. B. Run oder Paragraph. Das heißt, Sie können nicht vollständig vom Casting wegkommen, wenn Sie mit Aspose.Words DOM arbeiten, das zusammengesetzt ist.
Um die Umwandlung zu reduzieren, stellen die meisten Aspose.Words -Klassen Eigenschaften und Auflistungen bereit, die einen stark typisierten Zugriff ermöglichen. Es gibt drei grundlegende Muster für den typisierten Zugriff:
- Ein übergeordneter Knoten macht typisierte FirstXXX - und LastXXX -Eigenschaften verfügbar. Zum Beispiel hat die Document die Eigenschaften FirstSection und LastSection. Ebenso hat Table Eigenschaften wie FirstRow, LastRow und andere.
- Ein übergeordneter Knoten macht eine typisierte Sammlung von untergeordneten Knoten verfügbar, z. B. Document.Sections, Body.Paragraphs und andere.
- Ein untergeordneter Knoten bietet typisierten Zugriff auf seinen übergeordneten Knoten, z. B. Run.ParentParagraph, Paragraph.ParentSection und andere.
Typisierte Eigenschaften sind lediglich nützliche Verknüpfungen, die manchmal einen einfacheren Zugriff bieten als generische Eigenschaften, die von Node.ParentNode und CompositeNode.FirstChild geerbt wurden.
Das folgende Codebeispiel zeigt, wie typisierte Eigenschaften verwendet werden, um auf Knoten des Dokumentbaums zuzugreifen: