XSD Datei aus XML Datei generieren

Normalerweise ist es so, das mir als Entwickler im WebService Bereich WSDL-Dateien oder XSD-Dateien vorliegen. Aus beiden Dateiformaten lassen sich zur späteren Verarbeitung wunderbar Java Klassen generieren. Vor einiger Zeit hatte ich jedoch das Problem, das mir ein Unternehmen lediglich eine XML-Datei zur Verfügung stellen konnte. Dies ist zugegebenermaßen eine Ausnahme und wohl nur der Versuch eine Art WebService zur Verfügung zu stellen.

Dennoch stand ich vor der Schwierigkeit, die XML-Datei mit Java verarbeiten zu müssen. Natürlich kann an dieser Stelle mühselig ein eigener Wrapper manuell erstellt werden. Effektiv ist aber was anderes …
Auf der Suche nach einer angemesseneren Lösung bin ich über das Kommandozeilen-Tool jing-trang gestolpert.

Ziemlich einfach, ziemlich effektiv.

Anhand eines kleinem Beispiels werde ich das Tool nun demonstrieren. Verwendet wird die Version trang-20091111.zip (aktueller Stand zum Zeitpunkt der Veröffentlichung dieses Beitrages).

Vorbereitung

Im ersten Schritt wird die aktuelle Jing-Trang Version im Download Bereich heruntergeladen und in ein beliebiges Verzeichnis entpackt. Entpackt habe ich die Datei trang-20091111.zip in folgenden Ordner: ~/Desktop/xsd2xml.
In dem entpacktem Ordner befinden sich vier Dateien, wobei die wichtigste wohl das Tool mit dem Namen trang.jar ist.

XML-Datei

Als Vorlage verwende ich die XML-Datei aus dem Java und XML Tutorial. Einziger Unterschied: Die Verlinkung auf die DTD Datei (< !DOCTYPE literature SYSTEM "literature.dtd">) wurde entfernt.

Die Datei befindet sich in dem Verzeichnis ~/Desktop/xsd2xml.

Hierzu ein kleiner Auszug aus der Datei.

<?xml version="1.0" encoding="UTF-8"?>
 
<literature>
  <book>
    <authors>
      <author>
        <firstName>Helmut</firstName>
        <lastName>Vonhoegen</lastName>
      </author>
    </authors>
    <title>Einstieg in XML</title>
    <edition>
      <publisher>Galileo Computing</publisher>
      <editionNo>2</editionNo>
      <publicationYear>2004</publicationYear>
    </edition>
    <ISBN>3-89842-488-X</ISBN>
  </book>
  <book>
  ...
</literature>

XSD-Datei generieren

Zur Generierung der XSD-Datei wird das Tool mit zwei Parametern aufgerufen. Der erste Parameter (literatur.xml) gibt die Quelldatei an, der zweite (literatur.xsd) die Zieldatei.

java -jar ~/Desktop/xsd2xml/trang-20091111/trang.jar literatur.xml literatur.xsd

Ergebnis

Erstellt wurde wie erwartet die Datei literatur.xsd in dem Verzeichnis ~/Desktop/xsd2xml/.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="literature">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="book"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="book">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="authors"/>
        <xs:element ref="title"/>
        <xs:element ref="edition"/>
        <xs:element ref="ISBN"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="authors">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="author"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="author">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="firstName"/>
        <xs:element ref="lastName"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="firstName" type="xs:string"/>
  <xs:element name="lastName" type="xs:NCName"/>
  <xs:element name="title" type="xs:string"/>
  <xs:element name="edition">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="publisher"/>
        <xs:element ref="editionNo"/>
        <xs:element ref="publicationYear"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="publisher" type="xs:string"/>
  <xs:element name="editionNo" type="xs:integer"/>
  <xs:element name="publicationYear" type="xs:integer"/>
  <xs:element name="ISBN" type="xs:NMTOKEN"/>
</xs:schema>

Ein kleiner Tipp: Wenn das Tool öfter Verwendung findet könnte darüber nachgedacht werden den Link auf die trang.jar Datei in die bashrc als alias zu schreiben, um nicht jedes Mal den vollqualifizierten Pfad angeben zu müssen. Konkret könnte dies so aussehen:

alias xml2xsd='java -jar ~/Desktop/xsd2xml/trang-20091111/trang.jar'

Die Generierung einer Datei wird dann wie folgt aufgerufen:

xml2xsd literatur.xml literatur.xsd

Das Beispiel kann mit allen vollständigen Dateien als ZIP Datei heruntergeladen werden.

Viel Spaß