Generieren von Code anhand von XML-Schemas oder DTDs
Sie können mit dem XMLSpy Codegenerator C#-, C++- oder Java-Programmcode anhand von XML-Schemas oder DTDs generieren. Die generierten Schema Wrapper-Bibliotheken können anschließend in Ihre benutzerdefinierte Applikation integriert werden, um XML-Dokumente mittels Programmen lesen oder ändern zu können bzw. in XML-Dokumente schreiben zu können.
Generieren von Programmcode
1.Öffnen Sie das Schema, für das Sie Quellcode generieren möchten.
2.Wählen Sie den Menübefehl DTD/Schema | Programmcode generieren.
3.Definieren Sie auf dem Register Vorlage auswählen des daraufhin angezeigten Dialogfelds die Codegenerierungsoptionen.
4.Klicken Sie auf OK. Darauf hin wird das Dialogfeld Ordner suchen angezeigt.
5.Wählen Sie den Zielordner aus und klicken Sie auf OK.
6.Sie werden aufgefordert, das neu erstellte Projekt in Microsoft Visual Studio zu öffnen. Klicken Sie auf Ja. Wenn Java-Code erzeugt wird, werden Sie aufgefordert, das entsprechende Ausgabeverzeichnis zu öffnen.
Wenn XMLSpy Code anhand eines XML-Schemas oder einer DTD generiert, werden die folgenden Bibliotheken generiert:
C++ oder C# | Java | Verwendungszweck |
Altova | com.altova | Basisbibliothek, enthält allgemeine Runtime-Unterstützung, ist für alle Schemas identisch. |
AltovaXML | com.altova.xml | Basisbibliothek, enthält Runtime-Unterstützung für XML, ist für alle Schemas identisch. |
[YourSchema] | com.YourSchema | Eine Bibliothek, die anhand des Input-Schemas generierte Deklarationen enthält, die denselben Namen wie die Schema-Datei oder DTD hat. Diese Bibliothek ist ein DOM (W3C Document Object Model) Wrapper, der es Ihnen gestattet, XML-Dokumente einfach und sicher zu lesen, zu bearbeiten und zu erstellen. Alle Daten befinden Sie im DOM und es gibt Methoden, um Daten aus dem DOM zu extrahieren und Daten im DOM zu aktualisieren und zu erstellen.
Der generierte C++-Code unterstützt entweder Microsoft MSXML oder Apache Xerces 3. Die Syntax zur Verwendung des generierten Codes ist mit Ausnahme geringer Unterschiede (so unterstützt Xerces z.B. mehr überladene Funktionen) bei beiden DOM-Implementierungen fast die gleiche.
Dem generierten C#-Code liegt die .NET Standard System.XML-Bibliothek als DOM-Implementierung zugrunde.
Dem generierten Java-Code liegt JAXP (Java API for XML Processing) als DOM-Implementierung zugrunde. |
[YourSchemaTest] | com.YourSchemaTest | Der generierte Code enthält auch ein Test-Applikationsgerüst, das nach Ihrem Schema (z.B. YourSchemaTest) benannt ist. Es handelt sich hierbei um eine kompilierbare Applikation, die eine leere Example()-Methode aufruft. Sie können in dieser Methode Ihren Testcode hinzufügen, um Ihre neu generierte Bibliothek schnell und einfach testen zu können. |
Beim Erstellen eines Prototyps einer Applikation anhand eines häufig geänderten XML-Schemas müssen Sie eventuell immer wieder Code im selben Verzeichnis generieren, damit die Änderungen am Schema sofort im Code berücksichtigt werden. Beachten Sie, dass die generierte Testapplikation und die Altova-Bibliotheken jedes Mal, wenn Sie Code im selben Zielverzeichnis generieren, überschrieben werden. Fügen Sie daher keinen Code zur generierten Testapplikation hinzu, sondern integrieren Sie stattdessen die Altova-Bibliotheken in Ihr Projekt (siehe Integrieren von Schema Wrapper-Bibliotheken). |
Namensgenerierung und Namespaces
XMLSpy generiert für alle deklarierten Elemente oder complexTypes, die einen complexTyp in Ihrem XML-Schema umdefinieren, Klassen, wobei die durch Erweiterungen von complexTyps in Ihrem XML-Schema definierte Klassenableitung beibehalten wird. Bei komplexen Schemas, in die Komponenten aus mehreren Namespaces importiert werden, behält XMLSpy diese Informationen durch Generierung der entsprechenden C#- oder C++-Namespaces oder Java-Pakete bei.
Im Allgemeinen versucht der Code Generator die Namen für generierte Namespaces, Klassen und Member aus dem Original-XML-Schema beizubehalten. Zeichen, die in Identifiern in der Zielsprache ungültig sind, werden durch ein "_" ersetzt. Namen, die mit anderen Namen oder reservierten Wörtern in Konflikt treten würden, werden durch Anhängen einer Nummer eindeutig identifizierbar gemacht. Die Generierung von Namen kann durch Änderung der Standardeinstellungen in der SPL-Vorlage beeinflusst werden.
Die Namespaces aus dem XML-Schema werden in Java in Pakete oder in C#- oder C++-Code in Namespaces konvertiert, wobei das Namespace-Präfix aus dem Schema als Code-Namespace verwendet wird. Die gesamte Bibliothek wird in ein Paket oder einen anhand des Schema-Dateinamens abgeleiteten Namespace eingeschlossen, sodass Sie in einem Programm mehrere generierte Bibliotheken verwenden können, ohne dass es zu Namenskonflikten kommt.
Datentypen
XML-Schema hat ein etwas komplexeres Datentypmodell als Java, C# oder C++. Der Code Generator konvertiert die vordefinierten XML-Schematypen in sprachspezifische primitive Typen oder in mit der Altova-Bibliothek bereitgestellte Klassen. ComplexTypes und abgeleitete Typen, die im Schema definiert sind, werden in der generierten Hierarchie in Klassen konvertiert. Enumeration Facets von simpleTypes werden in Symbolkonstanten konvertiert.
Das Mapping von simpleTypes kann in der SPL-Vorlage konfiguriert werden, siehe SPL-Referenz.
Wenn in Ihren XML-Instanzdateien Schematypen im Zusammenhang mit Uhrzeit und Dauer verwendet werden, so werden diese im Code in native Altova-Klassen konvertiert. Informationen zu den Altova-Bibliotheksklassen finden Sie unter:
•Referenz zu generierten Klassen (C++)
•Referenz zu generierten Klassen (C#)
•Referenz zu generierten Klassen (Java)
Informationen zur Typkonvertierung und anderen Details zu den einzelnen Sprachen finden Sie unter:
•Informationen zu Schema Wrapper-Bibliotheken (C++)
•Informationen zu Schema Wrapper-Bibliotheken (C#)
•Informationen zu Schema Wrapper-Bibliotheken (Java)
Speicherverwaltung
Eine DOM-Struktur besteht aus Nodes, die immer einem bestimmten DOM-Dokument zugeordnet sind - selbst, wenn die Nodes derzeit nicht im Inhalt des Dokuments vorkommen. Bei allen generierten Klassen handelt es sich um Referenzen auf die DOM-Nodes, für die sie stehen, nicht um Werte. Dies bedeutet, dass bei Zuweisung einer Instanz einer generierten Klasse nicht der Wert kopiert wird, sondern nur eine zusätzliche Referenz auf dieselben Daten.
XML Schema-Unterstützung
Die folgenden XML-Schema-Konstrukte werden in Code übersetzt:
a) XML Namespaces
b) Simple Types
•Built-in XML Schema Typen
•Durch Extension abgeleitete Simple Types
•Durch Restriction abgeleitete Simple Types
•Facets
•Enumerations
•Patterns
c) Complex Types:
•Built-in anyType Node
•Benutzerdefinierte Complex Types
•Durch Extension abgeleitete: Auf abgeleitete Klassen gemappte
•Durch Restriction abgeleitete
•Complex Content
•Simple Content
•Mixed Content
Die folgenden komplexen XML-Schema-Funktionen werden in generierten Wrapper-Klassen nicht (oder nicht vollständig) unterstützt:
•Wildcards: xs:any und xs:anyAttribute
•Inhaltsmodelle (sequence, choice, all): Kompositor der obersten Ebene ist in SPL vorhanden, wird aber von den generierten Klassen nicht umgesetzt.
•Standardwerte und festgelegte Werte für Attribute: Diese sind in SPL verfügbar, werden aber von den generierten Klassen nicht gesetzt oder umgesetzt.
•Attribute xsi:type, abstract types: Verwenden Sie die SetXsiType()-Methode der generierten Klassen, wenn Sie das xsi:type-Attribut schreiben müssen.
•Union Types: Es werden nicht alle Kombinationen unterstützt.
•Substitution Groups werden zum Teil unterstützt (werden wie "choice" aufgelöst)
•Attribut nillable="true" und xsi:nil
•Uniqueness Constraints
•Identity Constraints (key und keyref)