XML Schema- Komplexe Elemente

25.01.2017 11:31 Uhr

XML Schema- Komplexe Elemente

Im Gegensatz zu den einfachen Elementen (simple types) können komplexe Elemente (complex types) sowohl Kind-Elemente wie Attribute enthalten. Grundsätzlich werden vier Arten unterschieden:

  1. Leere Elemente.
  2. Elemente, die weitere Kind-Elemente enthalten.
  3. Elemente, die Text enthalten.
  4. Elemente, die Text und Kind-Elemente enthalten

Mittels eines Indicator-Elements wird festgelegt, in welcher Reihenfolge die Kind-Elemente vorkommen dürfen bzw. müssen:

  1. <sequence> (Abfolge)
    Der Inhalt des Elements besteht aus einer beliebigen Anzahl von Elementen, die in der vorgegebenen Reihenfolge verwendet werden müssen.
  2. <choice> (Auswahl)
    Der Inhalt des Elements besteht aus einem der aufgeführten Elemente.
  3. <all>
    Alle Elemente können maximal einmal in beliebiger Reihenfolge auftreten.

Leere Elemente

Leere Elemente sind Elemente, die nur aus einem Start-Tag bestehen und keine Information umschließen. Diese Tags enthalten häufig Attribute, die spezifische Informationen beinhalten.

Instanz

<bild id="86396174"/>

Nach der Festlegung des Namens für das Element erfolgt die Deklaration des Typs als und anschließend die Bestimmung des Attributs mit Name und Datentyp.

XML-Schema

<xs:element name="bild">
    <xs:complexType>
        <xs:attribute name="id" type="xs:integer"/>
    </xs:complexType>
</xs:element>

Definition von Kind-Elementen

Das Element <person> hat im folgenden Beispiel eine Sequenz <sequence> von Kind-Elementen, bestehend aus <vorname>, <nachname>, <gebdatum> und <alter>. Diesen Kind-Elementen ist ein Datentyp zugewiesen, der bestimmt, welche Art von Zeichen in der Instanz eingesetzt werden kann.
Instanz

<person>
    <vorname>Lieschen</vorname>
    <nachname>Müller</nachname>
    <gebdatum>2001-10-28</gebdatum>
    <alter>57</alter>
</person>

XML-Schema

<xs:element name="person">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="vorname" type="xs:string"/>
            <xs:element name="nachname" type="xs:string"/>
            <xs:element name="gebdatum" type="xs:date"/>
            <xs:element name="alter" type="xs:integer"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Soll eine Auswahl getroffen werden, muss das Element <choice> verwendet werden.

XML-Schema

<xs:element name="bild">
    <xs:complextype>
        <xs:choice>
            <xs:element name="foto" type="xs:string">
            <xs:element name="gemaelde" type="xs:string">
            <xs:element name="zeichnung" type="xs:string">
        </xs:choice>
    </xs:complextype>
</xs:element>

Bei dieser Notation muss ausgewählt werden, ob es ein Kind-Element <foto>, <gemaelde> oder <zeichnung> geben soll.

Instanz

<bild>
   <foto>Lieschen</foto>
</bild>

oder

<bild>
    <gemaelde>Lieschen</gemaelde>
</bild>

oder

<bild>
    <zeichnung>Lieschen</zeichnung>
</bild>

Eine weitere Möglichkeit stellt das Element <all> dar, das vorgibt, dass die Kind-Elemente alle genau einmal vorkommen müssen, allerdings in beliebiger Reihenfolge.

XML-Schema

<xs:element name="person">
    <xs:complexType>
        <xs:all>
            <xs:element name="vorname" type="xs:string"/>
            <xs:element name="nachname" type="xs:string"/>
            <xs:element name="gebdatum" type="xs:date"/>
            <xs:element name="alter" type="xs:integer"/>
        </xs:all>
    </xs:complexType>
</xs:element>

Instanz

<person>
    <gebdatum>2001-10-28</gebdatum>
    <vorname>Lieschen</vorname>
    <nachname>Müller</nachname>
    <alter>57</alter>
</person>

oder

<person>
        <nachname>Müller</nachname>
	<vorname>Lieschen</vorname>
	<gebdatum>2001-10-28</gebdatum>
	<alter>57</alter>
</person>

oder

<person>
	<vorname>Lieschen</vorname>
	<nachname>Müller</nachname>
	<gebdatum>2001-10-28</gebdatum>
	<alter>57</alter>
</person>

Verschachtelte Inhaltsmodelle

Es besteht auch die Möglichkeit, dass die Inhaltsmodelle ineinander verschachtelt werden. Es wird beispielsweise eine Sequenz definiert, die eine Auswahl beinhaltet.

XML-Schema

<xs:element name="Adresse">
    <xs:complexType>
        <xs:sequence>
            <xs:choice>
                <xs:element name="Postfach" type="xs:string"/>
                <xs:sequence>
                    <xs:element name="Strasse" type="xs:string"/>
                    <xs:element name="Hausnummer" type="xs:string"/>
                </xs:sequence>
            </xs:choice>
            <xs:element name="PLZ" type="xs:integer"/>
            <xs:element name="Ort" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Das obige Beispiel bildet eine Postadresse ab, bei der entweder ein Postfach oder eine Kombination aus Straße und Hausnummer, gefolgt von der Angabe der Postleitzahl und des Ortes verwendet wird.

Instanz

<Adresse>
	<Strasse>Albertus Magnus Platz</Strasse>
	<Hausnummer>1a</Hausnummer>
	<PLZ>50931</PLZ>
	<Ort>Köln</Ort>
</Adresse>

oder

<Adresse>
	<Postfach>135A675</Postfach>
	<PLZ>50931</PLZ>
	<Ort>Köln</Ort>
</Adresse>

Häufigkeitsbegrenzungen

Mittels der Attribute minOccurs und maxOccurs und in der Element-Deklaration kann die Häufigkeit der Vorkommen der Kind-Elemente genau bestimmt werden:

<xs:element name="bilder">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="foto" type="xs:string"
                maxOccurs="100" minOccurs="0"/>
            <xs:element name="gemaelde" type="xs:string"
                maxOccurs="unbounded" minOccurs="10"/>
            <xs:element name="zeichnung" type="xs:string"
                maxOccurs="50"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Elemente, die nur Text enthalten

Elemente, mit einfachem Inhalt (simpleContent) enthalten nur Text (PCData) und Attribute. Im nachfolgenden Beispiel wird zu einem beliebigen Text (statement) im Attribut language die verwendete Sprache festgehalten.

XML-Schema

<xs:element name="statement">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="language" type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

Instanz

<statement language="deutsch"> ... Die Deutsch-Französische Gesellschaft Halle 
existiert seit Februar 1990 und ist seit ...</statement>

Elemente mit Text und Kind-Elementen

Nicht selten kommt es vor, dass ein Element sowohl Text wie auch weitere Kind-Elemente beinhalten soll. Eine solche Konstruktion ist einfach über die Wertzuweisung true zu dem Attribut mixed des Elementes <complexType> modellierbar.

XML-Schema

<xs:element name="article">
    <xs:complexType mixed="true">
        <xs:all>
            <xs:element name="id" type="xs:integer"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="date" type="xs:date"/>
        </xs:all>
    </xs:complexType>
</xs:element>

Instanz

<article>
	<id>72108691</id>
	Tageseintrag:
	<date>1968-01-27</date>
	Die Frankfurter
	<title>Brecht-Tage</title>
	anlässlich des 70. Geburtstags Bertolt Brechts (1956)
	werden eröffnet. Sie enden am 11. Februar.
</article>

vorherige Folie / nächste Folie

Schlagwörter: