Guide: XML (XML Schema XSD – Teil 2)

4.2.2.3 Definition von Typen

Jedem Element und Attribut werden Typen zugeordnet. In der XSD gibt es einfache (“simpleType”) und komplexe(“complexType”) Typen.

Einfache Typen “simpleType”:

Der “simpleType” definiert einen einfachen Typ, welcher bereits vordefinierte Typen, wie z.B. xsd:string, xsd:int etc. enthält.

Es ist auch möglich, eigene einfache Typen zu schaffen, allerdings müssen diese auf einfachen, schon vordefinierten Typen bestehen und diese einschränken.

Beispiel in XSD:
<?xml version=”1.0” encoding=”UTF-8”?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:simpleType name="waehrung">
   <xsd:restriction base=”xsd:string”>
            <!--Facette -->
   </xsd:restriction>
   </xsd:simpleType>
</xsd:schema>

 

In dem Falle haben wir einen einfachen Typ namens “waehrung” geschaffen, welcher über xsd:restriction Beschränkungen enthält, allerdings basiert (“base”) dieser Typ “waehrung” auf den vordefinierten Typ “xsd:string”, wobei dann durch so genannte Facetten die Beschränkung erfolgt.

 

Komplexe Typen “complexType”:

Komplexe Datentypen erlauben in XML die Kindelemente eines Elementes zu beschreiben.

Beispiel:
<xsd:element name="Name" type=”name”>
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element name="Vorname" type="xsd:string"/>
         <xsd:element name="Nachname" type="xsd:string"/>
        </xsd:sequence>
   </xsd:complexType>
</xsd:element>

Hiermit weise ich dem Element “Name” den Typ “Name” zu. Da es diesen Datentyp noch nicht gibt, muss er erst beschrieben werden, welche Elemente er enthält.

Das hier angegebene Beispiel bedeutet, dass das Element “Name”, 2 Kindelemente hat.

Einfacher Inhalt “simpleContent”:

Der “simpleContent” definiert einen einfachen Inhalt, was bedeutet, dass er nur Text enthalten darf.

Komplexer Inhalt “complexContent”:

Der “complexContent” definiert einen komplexen Inhalt, was bedeutet, dass er Text, Attribute und andere Elemente enthalten darf.

 

4.2.2.4 Definition des Inhaltes

 

4.2.2.4.1 Sequenz

Merkmale:

  • Elemente müssen der Reihe nach vorkommen.
  • Falls keine anderen Werte über minOccurs oder maxOccurs angegeben wird, muss das Element einmal vorkommen.
Beispiel:
<xsd:element name="Anschrift" type=”anschrift”>
   <xsd:complexType name=”anschrift”>
      <xsd:sequence>
         <xsd:element name="wohnort" type="xsd:string"/>
         <xsd:element name="plz" type="xsd:int"/>
         <xsd:element name="strasse" type="xsd:string"/>
         <xsd:element name="nr" type="xsd:int"/>
         <xsd:element name="name" type="xsd:string"/>
        </xsd:sequence>
   </xsd:complexType>
</xsd:element>

 

4.2.2.4.2 Choice

Merkmale:

  • Aus einer Anzahl von Elementen darf, falls kein anderer Wert über Max/MinOccurs gesetzt, ein Element vorkommen. Ansonsten auch mehrere möglich.
  • Reihenfolge beliebig.
  • Durch das MaxOccurs ist es möglich zu sagen, dass Elemente mehrfach und die Reihenfolge beliebig ist
Beispiel:
<xsd:element name="Tier" type=”tier”>
   <xsd:complexType name=”tier”>
      <xsd:choice>
         <xsd:element name="Affe" type="xsd:string"/>
         <xsd:element name="Tiger" type="xsd:string "/>
         <xsd:element name="Leopard" type="xsd:string"/>
         <xsd:element name="Maus" type="xsd:string "/>
        </xsd:choice>
   </xsd:complexType>
</xsd:element>
4.2.2.4.3 All

Merkmale:

  • Jedes Element darf einmal vorkommen.
  • Reihenfolge spielt keine Rolle.
Beispiel:
<xsd:element name="Einkaufsliste" type=”einkaufsliste”>
   <xsd:complexType name=”einkaufsliste”>
      <xsd:all>
         <xsd:element name="Kaese" type="xsd:string"/>
         <xsd:element name="Milch" type="xsd:string "/>
         <xsd:element name="Butter" type="xsd:string"/>
         <xsd:element name="Wurst" type="xsd:string "/>
        </xsd:all>
   </xsd:complexType>
</xsd:element>

 

4.2.2.4.4 Group

Merkmale:

  • Gruppiert eine Reihe von Elementen oder Anweisungen.
Beispiel:
<xsd:complexType name="BestellungTyp">
  <xsd:sequence>
    <xsd:choice>
      <xsd:group ref="verschiedeneAdr"/>
      <xsd:element name="eineAdresse" type="DeAdresse"/>
    </xsd:choice>
    <xsd:element ref="Kommentar" minOccurs="0"/>
    <xsd:element name="Waren" type="WarenTyp"/>
  </xsd:sequence>
  <xsd:attribute name="bestelldatum" type="xsd:date"/>
</xsd:complexType>
         
<xsd:group name="verschiedeneAdr">
  <xsd:sequence>
    <xsd:element name="Lieferadresse" type="DeAdresse"/>
    <xsd:element name="Rechnungsadresse" type="DeAdresse"/>
  </xsd:sequence>
</xsd:group>   

 

4.2.2.4.5 Any

Merkmale:

  • Erlaubt beliebigen Datentyp
4.2.2.4.6 Extensions

Extension bedeutet auf Deutsch Ableitung. Das Prinzip was dahinter steckt, ist bereits aus der Programmierung bekannt – Stichwort lautet Vererbung.

Ableitungen von Elementtypen sind dann interessant, wenn man manche Elemente spezialisieren möchte. Man spart sich dadurch eine Menge Tipparbeit und man kann einfach andere Kindelemente an das Elternelement dranhängen. Als Beispiel möchte ich hier die Einkaufsliste erweitern.

Beispiel:
<xsd:complexType name=”myEinkaufsliste”>
   <xsd:complexContent>
      <xsd:extension base=”einkaufsliste”>
         <xsd:all>
         <xsd:element name="Fertigesssen" type="xsd:string"/>
           </xsd:all>
      </xsd:extension>
   </xsd:complexContent>
</xsd:complexType>

 

4.2.2.4.7 Restrictions

Man kann auch einen neuen Elementtypen erzeugen, indem man einen bereits vorhandenen Elementtyp beschränkt. Dafür müssen alle Elemente aufgezählt werden und dabei kann man beliebig die Beschränkungen verteilen.

Als Beispiel möchte ich mein Anschriftsschema von oben verwenden.

Beispiel:
<xsd:complexType name=”singelAnschrift”>
   <xsd:restriction base="anschrift">
      <xsd:sequence>
         <xsd:element name="wohnort" type="xsd:string"/>
         <xsd:element name="plz" type="xsd:int"/>
         <xsd:element name="strasse" type="xsd:string"/>
         <xsd:element name="nr" type="xsd:int"/>
         <xsd:element name="name" type="xsd:string" minOccurs=”1” maxOccurs=”1”/>
        </xsd:sequence>
   </xsd:restriction>
</xsd:complexType>

Bei dem Beispiel muss immer ein Element “name” vorkommen.

Liste der Einschränkungen, auch Facetten genannten, durch welche man einfache Beschränkungen realisieren kann:

  • length, maxLength, minLength – Länge eines Strings
  • enumeration – Auswahl
  • pattern – Reguläre Ausdrücke
  • minExclusiv, maxExclusiv, minInclusiv, maxInclusiv – Wertebereicheinschränkung
  • totalDigits, fractionDigits – Einschränkung der Dezimalstelle (Gesamtzahl, Nachkommastelle)
  • whiteSpace – Behandlung von Tabs und Leerzeichen
Beispiel:
<xsd:simpleType name=”IQ”>
   <xsd:restriction base="xsd:decimal">
      <xsd:minInclusiv value=”80”/>
      <xsd:maxInclusiv value="180"/>
      <xsd:fractionDigits value=”3”/>
   </xsd:restriction>
</xsd:simpleType>

 

4.2.2.4.8 List

In einem XML Element können durch den Typ Liste mehrere “pseudo”-Elemente drin stehen. Die Elemente müssen allerdings alle vom selben Typ sein.

Beispiel:
<xsd:simpleType name="BundeslandListe">
    <xsd:list itemType="Bundesland"/>
</xsd:simpleType>

<xsd:simpleType name="SechsBundesländer">
    <xsd:restriction base="BundeslandListe">
    <xsd:length value="6"/>
    </xsd:restriction>
</xsd:simpleType>
   

Beispiel:
<sechsLänder>Sachsen       Baden-Württemberg   Rheinland-Pfalz
             Brandenburg   Niedersachsen       Hessen</sechsLänder> 

 

4.2.2.4.9 Union

Die Union bietet in der XSD die Möglichkeit einem Element mehrere Typen zu geben, sodass man ähnlich zur Liste, mehrere “pseudo” Elemente in einem Tag hat.

Syntax: <xsd:union memberTypes=”Typen” />

Beispiel:
<xsd:simpleType name="Irgendwas">
   <xsd:union memberTypes="xsd:int xsd:string"/>
</xsd:simpleType>

Beispiel:
<Irgendwas>12 Bla</Irgendwas> 
<Irgendwas>12</Irgendwas> 
<Irgendwas>12 Bla 12</Irgendwas> 
<Irgendwas>Bla Bla</Irgendwas> 

 

4.2.2.4.10 AnyAttribute

Erlaubt beliebige Attribute innerhalb von Elementen.

4.2.2.4.11 AttributeGroup

Gruppiert Attribute, sodass ein einfacher Zugriff auf diese möglich ist.

 

Letzte Posts

  • image_thumb.png
    NuGet Package Restore & Build Server wie z.B. AppVeyor

    NuGet ist ja mittlerweile weit verbreitet, aber eine Frage stellt sich natürlich immer noch: Checkt man die NuGet Packages ein oder nicht? In meinem kleinen Side-Projekt, welches auf GitHub liegt und ich über AppVeyor auch bauen lasse nutze ich das Package Restore Feature von NuGet, d.h. in meinem Repository befindet sich kein NuGet Package mehr, […]

  • image.png
    Microsoft Account Login via ASP.NET Identity

    Der Microsoft Account ist die zentrale Identifikationsstelle in der “Consumer-Microsoft-Welt”, allerdings ist das Einbinden eben dieser in die eigene Applikation eher schwierig. Das “Live SDK” ist nun unter dem OneDrive Dev Center zu finden und ganz professionell wurden auch alle Links zum alten Live SDK damit unbrauchbar gemacht. Beim Microsoft Account ist es auch unmöglich […]

  • image.png
    Zeitgesteuerte Azure WebJobs – so einfach kann Azure sein

    Das noch in Entwicklung befindliche Azure WebJob SDK bietet einige coole Features zum Verarbeiten und Bereitstellen von Daten. Bekanntes Beispiel ist das Sample welches auf eine Azure Queue lauscht und sobald ein Item da vorhanden ist anfängt dies zu verarbeiten. Szenario: Zeitgesteuerte Aktivitäten – ohne Queue und co. Mein Szenario war allerdings wesentlich trivialer: Ich […]

  • image.png
    Get Involved in OSS! Ja, aber wie geht das denn mit GitHub?

    Auch im .NET Lager gibt es Bewegung im OSS Bereich und es gibt verschiedene Arten wie man bei einem Open Source Projekt “Contributed”. Was zählt alles zu “Contribution”? Unter “Contribution” läuft eigentlich alles – ob es Fragen/Probleme zu dem Projekt via Issues ist oder Dokumentation nachreicht oder ob man darüber bloggt oder das Projekt vorstellt. […]

  • HowTo: Web.config samt eigener ConfigSection zur Laufzeit ändern

    In dem HowTo geht es darum wie man die Web.config zur Laufzeit ändert und was es dabei zu beachten gilt. Das ganze klappt auch mit komplexeren ConfigSections. Eigene ConfigSection? Vor einer ganzen Weile habe ich mal über das Erstellen einer eigenen ConfigSection geschrieben – im Grunde nutzen wir jetzt fast dieselbe Config. Zur Laufzeit? Startet […]

Support us!