Geschätzte Zeit zum Lesen: circa 2 Minuten

Validieren von XML mittels XSD Teil I

Trotz der immer stärker werdenden Verbreitung von JSON als Austauschformat existiert XML immer noch in sehr vielen Schnittstellen. Ein wichtiger Punkt bei dem Umgang mit XML ist die Validierung. Eine Voraussetzung für eine fehlerfreie Verarbeitung von XML ist die Festlegung auf ein fest definiertes Format. An dieser Stelle der Validierung kommt XSD in das Spiel.


XSD (XML Schema Definition)

Ein XSD definiert die Struktur eines XML-Dokumentes, in dem es für den Aufbau, das Vorkommen von “Nodes” und Attributen genaue Vorschriften liefert. XSD kennt dabei einfache und komplexe Datentypen.

Einfache vordefinierte Datentypen:

Sind wie in anderen Sprachen atomare Typen.

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:float
  • xs:boolean
  • xs:date
  • xs:time

Komplexe Datentypen

Sind Datentypen die andere Datentypen oder Attribute enthalten können. Es existieren vier Gruppen komplexer Typen.

leere Elemente :

<foo id="0815"/>

Elemente, die andere Elemente untergeordnet haben:

<foo id="0815">
	<bar id="0816"/>
	<bar id="0817"/>
</foo>

Elemente, die nur Text beinhalten:

<foo id="0815">
	Bar
</foo>

Elemente, die andere Elemente und Text beinhalten:

<foo id="0815">
	Bar
	<bar id="0816"/>
</foo>
Komplexe Typen in einer xsd definieren

Einen komplexen Typ kann man auf folgende beiden Arten definieren:

Variante 1:

<xs:element name="kunde">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="vorname" type="xs:string"/>
      <xs:element name="nachname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Variante 2:

<xs:element name="kunde" type="personeneigenschaften"/>

<xs:complexType type="personeneigenschaften">
	<xs:sequence>
	  <xs:element name="vorname" type="xs:string"/>
	  <xs:element name="nachname" type="xs:string"/>
	</xs:sequence>
</xs:complexType>

Beide Varianten definieren eine Struktur, welche aus einer “Node” besteht mit dem Namen >kunde< die wiederum zwei “subnodes” hat. Erste “subnode” >vorname< zweite “subnode” >nachname<. Durch den “Sequence Indicator” <xs:sequence> ist auch die Reihenfolge vorgeschrieben. Zu bevorzugen ist eigentlich immer die Variante 2, da sie die Möglichkeit bietet den “type” auch an anderen Stellen als Beschreibung wiederzuverwenden.

Beispiel Typen Wiederverwendung:

<xs:element name="kunde" type="personeneigenschaften"/>
<xs:element name="patient" type="personeneigenschaften"/>
<xs:element name="angestellter" type="personeneigenschaften"/>
<xs:element name="nachbar" type="personeneigenschaften"/>

<xs:complexType type="personeneigenschaften">
	<xs:sequence>
	  <xs:element name="vorname" type="xs:string"/>
	  <xs:element name="nachname" type="xs:string"/>
	</xs:sequence>
</xs:complexType>

Ebenso besteht bei Variante 2 die Möglichkeit zur Erweiterung. Auf diese Art und Weise ist es möglich Basistypen zu definieren.

Beispiel Typen Erweiterung:

<xs:element name="kunde" type="personeneigenschaften"/>
<xs:element name="patient" type="patienteneigenschaften"/>


<xs:complexType type="personeneigenschaften">
	<xs:sequence>
	  <xs:element name="vorname" type="xs:string"/>
	  <xs:element name="nachname" type="xs:string"/>
	</xs:sequence>
</xs:complexType>

<xs:complexType name="patienteneigenschaften">
  <xs:complexContent>
    <xs:extension base="personeneigenschaften">
      <xs:sequence>
        <xs:element name="gkvName" type="xs:string"/>
        <xs:element name="gkvNummer" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

Das folgende XML-Fragment lässt sich durch die XSD-Definition aus (Beispiel Typen Erweiterung) erfolgreich validieren.

<kunde>
  <vorname>Karl</vorname>
  <nachname>Mayer</nachname>
</kunde>
<patient>
  <vorname>Karl</vorname>
  <nachname>Mayer</nachname>
  <gkvName>Krankenkassenname</gkvName>
  <gkvNummer>gk0815123</gkvNummer>
</patient>