In diesem Artikel erstellen wir eine exemplarische XML-Datei mit einem zugrunde liegendem XSD-Schema. Der bedeutsamste Unterschied zwischen XML und HTML liegt darin, dass XML für den Datentransport mit dem Fokus auf den Daten selbst entwickelt wurde.

HTML hingegen wurde entwickelt, um Daten darzustellen - mit dem Fokus auf dem Aussehen. In XML gibt es zudem keine vordefinierten Tags, wie in HTML. Bei W3Schools.com gibt es ein schickes Tutorial, aus dem ich meine Beispiele abgeleitet habe.

XML-Tags sind Case-sensitive, man muss also die Groß- und Kleinschreibung unbedingt beachten. Die Werte von Attributen müssen immer in Anführungszeichen eingefasst sein.

Verschachtelung

XML-Elemente können beliebig tief ineinander verschachtelt werden. Man unterscheidet hier zwischen "Eltern", "Kindern" und "Geschwistern".

<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

Formatierung

Die folgende Zeile bindet eine externce CSS-Datei ein, um die XML-Elemente darzustellen (Achtung, diese Variante wird nicht empfohlen, ist aber möglich):

<?xml-stylesheet type="text/css" href="cd_catalog.css"?>

Besser ist es, die XML-Datei mit XSLT (eXtensible Stylesheet Language Transformations) zu formatieren. Dadurch können XML-Elemente hinzugefügt oder weggelassen oder auch neu sortiert werden:

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:for-each select="breakfast_menu/food">
  <div style="background-color:teal;color:white;padding:4px">
    <span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
    <xsl:value-of select="price"/>
    </div>
  <div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
    <p>
    <xsl:value-of select="description"/>
    <span style="font-style:italic"> (<xsl:value-of select="calories"/> calories per serving)</span>
    </p>
  </div>
</xsl:for-each>
</body>
</html>

Datenaustausch

Um eine XML-Datei im Hintergrund mit neuen Daten von einem Server zu versorgen bzw. um Daten zu senden, bietet sich das Feature HttpRequest an.

XSD-Schema

Die Definition eines Schemas ist hilfreich, um (eigene) Daten zu validieren, gegen richtige Datentypen abzugleichen und Konformität herzustellen. Sie unterstützen die XML-Sprache (im Gegensatz zur nicht empfohlenen DTD-Definition) und Namespaces sowie Restriktionen.

Ein XML-Schema beginnt immer mit einem schema-Element. Dort wird der Namespace (Gültigkeitsraum) des Schemas angegeben und ein Haufen Zeug, auf das wir nicht näher eingehen müssen. Diese Metadaten müssen auch im Instanzdokument auftauchen:

<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.oth.de/qmc/01/blutzucker"           
elementFormDefault="qualified"           
xmlns:bz="http://www.oth.de/qmc/01/blutzucker">

<!-- content of schema -->

</xs:schema>

Nun wollen wir eine Definition der Datenstruktur, mit welcher Blutzuckermesswerte erfasst werden können. Es soll immer ein Zeitstempel "erfasst" (als Attribut eines Elements) angegeben werden, zusätzlich entweder ein Messwert mit Einheit (Pflichtfeld durch das Attribut required) oder die Kategorie (Hoher oder Niedriger Blutdruck). Eine der beiden Möglichkeiten muss im Instanzdokument (Erklärung später) genau einmal gewählt werden, diese Vorgabe erfolgt durch die Flags minOccurs und maxOccurs. Den complexType brauchen wir, weil ein Element aus weiteren Typen (Attribute, Elemente, Restriktionen) besteht. Der Typ der Elemente bzw. Attribute referenziert auf eine Definition weiter unten in der Schema-Datei, das erhöht die Übersichtlichkeit und Flexibilität. Der folgende Ausschnitt zeigt die Definition des Typs blutzuckerType:

<!-- Schema-header (siehe oben) -->

<xs:complexType name="blutzuckerType">       
<xs:choice minOccurs="1" maxOccurs="1">           
<xs:element name="wert">             
  <xs:complexType> 
       <xs:simpleContent>   
           <xs:extension base="xs:positiveInteger">   
            <xs:attribute name="einheit" type="bz:blutzuckerEinheit" use="required">
</xs:attribute>   
          </xs:extension>               
    </xs:simpleContent>       
      </xs:complexType>         
  </xs:element>     
   
<xs:element name="kategorie" type="bz:blutzuckerKategorien">
  </xs:element>
  </xs:choice>   
 
<xs:attribute name="erfasst" type="xs:dateTime" use="required">
</xs:attribute>   
</xs:complexType>

Nun widmen wir uns dem zweiten Teil der Schemadatei mit weiteren Typdefintionen und den Elementen, die ein Instanzdokument besitzen darf:

Das Flag ref="bz:blutzucker" im Verlauf-Element verweist auf das darüber definierte Element mit dem Namen blutzucker, das wiederum auf den oben bereits beschriebenen blutzuckerType verweist. Aus diesem Grund können im Instanzdokument für den Verlauf (siehe später) auch Messwerte samt Einheit und die Kategorie angegeben werden, denn die Typdefinition erlaubt es. Des Weiteren werden noch die Typen für blutzuckerKategorien und blutzuckerEinheit definiert und mit sog. Restriktionen (Einschränkungen) versehen. Diese Restriktionen erlauben lediglich Enumerationen im Instanzdokument und zwar nur jene, die hier im Schema definiert werden (high und low bzw. mg/dl und mmol/l).

<!-- Fortsetzung -->

<xs:element name="blutzucker" type="bz:blutzuckerType"/>

<xs:element name="verlauf">       
<xs:complexType>         
<xs:sequence>         
    <xs:element ref="bz:blutzucker" minOccurs="1" maxOccurs="unbounded"/>       
  </xs:sequence>       
</xs:complexType>   
</xs:element>

<xs:simpleType name="blutzuckerKategorien">     
<xs:restriction base="xs:string">       
  <xs:enumeration value="high"/>         
<xs:enumeration value="low"/>     
</xs:restriction> 
</xs:simpleType>

<xs:simpleType name="blutzuckerEinheit">   
<xs:restriction base="xs:string">       
<xs:enumeration value="mg/dl"/>         
<xs:enumeration value="mmol/l"/> 
  </xs:restriction> 
</xs:simpleType>

<!-- Schließen des Schemas -->

Im Folgenden sehen wir ein sog. "Instanzdokument", das eine Ausprägung des Schemas darstellt Es beginnt immer mit der XML-Version und realisiert danach eine Ausprägung nach den Vorgaben des oben beschriebenen Schemas.

Im folgenden Beispiel ist der Blutzucker-Messwert (ein Element) mit einem Zeitstempel (als Attribut) angegeben. Dieses Element enthält ein weiteres Element wert, das als Attribut die Einheit und als value den tatsächlichen Messwert enthält:

<?xml version="1.0"?>

<Blutzucker xmlns="http://www.oth.de/qmc/01/blutzucker
"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.oth.de/qmc/01/blutzucker schema.xsd"
erfasst="12017-06-08T13:20:00.000-05:00">
<wert einheit="mg/dl"> <!-- Wert mit der Einheit als Attribut -->
100
</wert>
</Blutzucker>

Die zweite Realisation des Schemas ist eine Kombination aus der Kategorie des Blutzuckers und den Messwerten samt Einheit, jeweils mit Zeitstempel,  in einem Element namens Verlauf:

<?xml version="1.0"?>

<verlauf
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'         
xsi:schemaLocation="http://www.oth.de/qmc/01/blutzucker schema.xsd"         
xmlns="http://www.oth.de/qmc/01/blutzucker">
   
<blutzucker erfasst="2017-05-28T13:05:00.000-02:00">       
<kategorie>high</kategorie>   
</blutzucker>   
<blutzucker erfasst="2017-05-29T17:10:00.000-02:00">       
<wert einheit="mg/dl">100</wert>   
</blutzucker>   
<blutzucker erfasst="2017-05-30T11:55:00.000-02:00">   
   <kategorie>low</kategorie>   
</blutzucker>   
<blutzucker erfasst="2017-05-31T10:40:00.000-02:00">     
  <wert einheit="mmol/l">50</wert>   
</blutzucker>

</verlauf>
Cookies make it easier for us to provide you with our services. With the usage of our services you permit us to use cookies.
Ok