Wie man mit benutzerdefiniertem XML Markup in .NET arbeitet
Wie man mit benutzerdefiniertem XML Markup in .NET arbeitet
Ein Word-Dokument kann benutzerdefinierte XML-Daten zusammen mit seinem sichtbaren Inhalt enthalten — Daten, die zum Binden von Inhaltssteuerelementen, zum Speichern anwendungsspezifischer Metadaten oder zum Einbetten von Teilen verwendet werden, die von einer anderen Anwendung hinzugefügt wurden. Dieser Leitfaden zeigt, wie man diese Daten liest, neue benutzerdefinierte XML-Teile hinzufügt und die Legacy-Smart-Tags untersucht, die ältere Dokumente möglicherweise noch enthalten, wobei CustomXmlPart, CustomXmlProperty und SmartTag in Aspose.Words FOSS für .NET verwendet werden.
Schritt-für-Schritt-Anleitung
Schritt 1: Benutzerdefinierte XML-Daten aus einem Dokument lesen
Document.CustomXmlParts gibt ein CustomXmlPartCollection zurück — derselbe Mechanismus, den Word verwendet, um XML-zugeordnete Inhaltssteuerelemente zu unterstützen. Durchlaufen Sie die Sammlung oder rufen Sie GetById(id) auf, wenn Sie bereits wissen, welchen Teil Sie benötigen, um ein CustomXmlPart zu erhalten. Jeder Teil stellt Id bereit, ein Data-Byte-Array, das das rohe XML enthält, ein DataChecksum zum Erkennen, ob sich die Daten geändert haben, ohne einen vollständigen Byte-Vergleich durchzuführen, und Schemas — ein CustomXmlSchemaCollection, das die mit ihm verbundenen XML-Schemata auflistet.
Schritt 2: Einen benutzerdefinierten XML-Teil hinzufügen oder aktualisieren
Rufen Sie CustomXmlPartCollection.Add(id, xml) mit einem ID-String und dem XML-Inhalt auf, um ein Teil direkt zu erstellen, oder erzeugen Sie ein CustomXmlPart separat und übergeben es an Add(part). Um Daten zu entfernen, verwenden Sie RemoveAt(index) an einer bestimmten Position oder Clear(), um jedes Teil zu entfernen. Beim Kopieren benutzerdefinierter XML-Daten zwischen Dokumenten verwenden Sie CustomXmlPart.Clone() (oder das Clone() der Sammlung) am Quellteil, anstatt den rohen XML erneut zu lesen und hinzuzufügen, und fügen dann das Duplikat zum Document.CustomXmlParts des Zieldokuments hinzu.
Schritt 3: Verwalten der mit einem Teil verknüpften Schemas
CustomXmlPart.Schemas erreicht ein CustomXmlSchemaCollection, das die mit dem Teil verknüpften Schema-URIs als einfache Zeichenketten statt als geparste Schemaobjekte verfolgt. Verwenden Sie Add(value), um eine Schema-URI zu registrieren, Remove(name) oder RemoveAt(index), um eine zu entfernen, IndexOf(value), um eine zu finden, und Clear(), um alle zu entfernen. Count gibt an, wie viele Schema-URIs derzeit mit dem Teil verknüpft sind.
Schritt 4: Arbeiten mit benutzerdefinierten Teilen auf Paketebene
Nicht jedes nicht sichtbare Teil in einem OOXML-Paket ist ein benutzerdefiniertes XML. Document.PackageCustomParts gibt ein CustomPartCollection von CustomPart-Objekten zurück – beliebige Teile, die im Paket gespeichert sind, wie z. B. Teile, die von einer anderen Anwendung hinzugefügt wurden, die die Datei berührt hat. Jeder CustomPart hat ein Name, ContentType, RelationshipType, ein Data-Byte-Array und ein IsExternal-Flag, das angibt, ob es sich um eine externe Referenz statt eingebetteten Inhalts handelt. Add(part), RemoveAt(index) und Clear() verwalten die Sammlung auf dieselbe Weise wie CustomXmlPartCollection. Prüfen Sie PackageCustomParts – nicht CustomXmlParts – wenn ein Teil, das Ihr Dokument enthalten sollte, nicht in der benutzerdefinierten XML-Sammlung erscheint.
Schritt 5: Untersuchen von Legacy-Smart-Tags und deren Eigenschaften
SmartTag ist ein Knotentyp (NodeType.SmartTag, erstellt mit SmartTag(doc)), der ein Legacy-Word-Smart-Tag darstellt, das um erkannten Text gewickelt ist. Prüfen Sie Element und Uri zusammen, um zu ermitteln, welcher Erkenner das Tag erstellt hat, und lesen Sie dann Properties – ein CustomXmlPropertyCollection – für die strukturierten Daten, die der Erkenner angehängt hat. Innerhalb eines CustomXmlPropertyCollection suchen der Indexierer (z. B. properties["MyProp"]) oder Contains(name) eine bestimmte Eigenschaft, IndexOfKey(name) gibt deren Position zurück, und Remove(name)/RemoveAt(index)/Clear() entfernen Einträge; jedes CustomXmlProperty wird mit CustomXmlProperty(name, uri, value) erstellt und stellt Name, Uri und Value bereit. Da SmartTag von CompositeNode abgeleitet ist, nimmt es wie andere Knoten am Dokumentbaum teil und unterstützt Accept(visitor), AcceptStart(visitor) und AcceptEnd(visitor) für eine DocumentVisitor-basierte Traversierung.
Häufige Probleme und Lösungen
CustomXmlPartCollection.GetById(id) liefert nichts Verwendbares zurück. Die ID stimmt mit keinem Teil überein, das derzeit in Document.CustomXmlParts. Durchlaufen Sie die Sammlung, um zu bestätigen, dass die ID vorhanden ist, oder fügen Sie das Teil zuerst hinzu mit Add(id, xml).
Ein von einer anderen Anwendung hinzugefügtes Teil wird beim Durchlaufen nicht gefunden CustomXmlParts. Nicht-XML Paketteile werden bereitgestellt über Document.PackageCustomParts, nicht CustomXmlParts. Überprüfen PackageCustomParts (a CustomPartCollection) stattdessen.
SmartTag.Properties ist leer, obwohl das Tag eindeutig vorhanden ist. Nicht jeder Smart-Tag-Erkenner fügt strukturierte Eigenschaften hinzu. Prüfen SmartTag.Element and Uri um zu bestätigen, welcher Erkenner das Tag erstellt hat, bevor Sie davon ausgehen, dass bestimmte Eigenschaften vorhanden sein werden.
Custom XML data scheint nicht mit dem Inhaltssteuerelement verbunden zu sein, an das es gebunden sein sollte. Inhaltssteuerelemente binden an custom XML über ihre eigene Datenbindungskonfiguration, nicht automatisch an jedes CustomXmlPart in Document.CustomXmlParts. Bestätigen Sie, welcher Teil eines bestimmten Inhaltssteuerelements tatsächlich gebunden ist, anstatt von einer Eins-zu-Eins-Beziehung auszugehen.
Häufig gestellte Fragen
Wie füge ich einem Dokument benutzerdefinierte XML-Daten hinzu?
Rufen Sie Document.CustomXmlParts.Add(id, xml) mit einer ID-Zeichenkette und XML-Inhalt auf, oder erstellen Sie ein CustomXmlPart separat und übergeben Sie es an Add(part).
Was ist der Unterschied zwischen CustomXmlPart und CustomXmlProperty?
CustomXmlPart ist ein ganzes XML-Dateninsel — ein Byte-Array-Payload plus zugehörige Schemata — erreichbar über Document.CustomXmlParts. CustomXmlProperty ist ein einzelnes Name/Wert-Paar, das typischerweise über SmartTag.Properties erreicht wird, anstatt direkt aus dem Dokument.
Wie kopiere ich benutzerdefinierte XML-Daten von einem Dokument zu einem anderen?
Rufen Sie Clone() auf dem Quell-CustomXmlPart auf, dann fügen Sie die Kopie mit Add(part) zum Document.CustomXmlParts des Zieldokuments hinzu.
Was ist ein SmartTag und wann würde ich einen begegnen?
SmartTag ist ein veraltetes Word-Feature, das Text darstellt, der von einem Smart-Tag-Erkenner erkannt und umschlossen wird — ein Dokumentknoten (NodeType.SmartTag) mit einem Element und Uri, die den Erkenner identifizieren, plus einer Properties-Sammlung von CustomXmlProperty-Werten. Es erscheint in Dokumenten, die mit aktivierten Smart Tags in älteren Word-Versionen erstellt oder bearbeitet wurden.
Wie erfahre ich, wie viele benutzerdefinierte XML-Teile oder Paketteile ein Dokument hat?
Lesen Sie Count auf Document.CustomXmlParts (ein CustomXmlPartCollection) bzw. Document.PackageCustomParts (ein CustomPartCollection).