Hans Wittwer

Geschichten, die das Leben schrieb

Datenaustauschformate

XML

🏁

XML (Extensible Markup Language)

XML ist weitverbreitet und hat weitreichende Möglichkeiten für den vollautomatischen Informationsaustausch zwischen Maschinen. Eine XML-Datei funktioniert auch ohne Definition. Falls Du eine Definition wünschst, empfehle ich XSD (siehe im Kapitel XML-Schema weiter unten).

Eine umfassende Anleitung zu XML findest Du auf der Site W3schools

Wir bauen zusammen eine XML-Datei für den Clubtrainer, damit er seine Schützlinge automatisiert zu einem Skirennen anmelden kann. Achtung! Das ist keine Norm, das ist eine einfache Übungsdatei zum besseren Verständnis.

Die Datei «anmeldung.xml» sieht so aus:

<?xml version="1.0"?>

<Anmeldung>
   <Event>
      <Nummer>234</Nummer>
      <Name>Alpine Schweizermeisterschaften 2025</Name>
      <Disziplin>Riesenslalom</Disziplin>
   </Event>
   <Club>
      <ClubNr>28</ClubNr>
      <ClubName>SC Belp</ClubName>
      <Trainer>Beat Bögli</Trainer>
      <Email>alpin@scbelp.ch</Email>
      <Software>BFY</Software>
   </Club>
   <Teilnehmer>
      <VorName>Peter</VorName>
      <NachName>Meyer</NachName>
      <Jahrgang>2002</Jahrgang>
      <Geschlecht>H</Geschlecht>
      <Punkte>78.35</Punkte>
   </Teilnehmer>
   <Teilnehmer>
      <VorName>Fritz</VorName>
      <NachName>Binggeli</NachName>
      <Jahrgang>2001</Jahrgang>
      <Geschlecht>H</Geschlecht>
      <Punkte>111.11</Punkte>
   </Teilnehmer>
   <Teilnehmer>
      <VorName>Trudy</VorName>
      <NachName>Guggisberg</NachName>
      <Jahrgang>1999</Jahrgang>
      <Geschlecht>D</Geschlecht>
      <Punkte>123.45</Punkte>
   </Teilnehmer>
 </Anmeldung>

Mit diesen Angaben kann der Organisator eine Kategorienzuteilung und Startnummernverlosung durchführen.

In der ersten Zeile steht die Deklaration, damit der Parser erkennen kann, was für ein Format folgt. Der Parser ist ein «Zerleger» und grübelt das Fleisch am Knochen heraus. Der Parser und das anschliessende Programm könnten Folgendes herausgrübeln und berechnen:

Alpine Schweizermeisterschaften 2025
Riesenslalom
 
Starliste Damen
StNr   Name JG    Club Punkte
1   Trudy Guggisberg 1999   SC Belp 123.45
 
Starliste Herren
1   Fritz Binggeli 2001   SC Belp 111.11
2   Peter Meyer 2002   SC Belp 78.35
 
25.12.2024 15:42 Software by buerofactory.ch

Etwa so geht XML. Damit der Ersteller den gewünschten Aufbau einhält, könntest Du eine DTD-Datei machen, die er in sein XML einbinden müsste. Wobei heute eher XML-Schemas verwendet werden. Siehe dazu die folgenden Kapitel.

DTD (Document Type Definition)

XML funktioniert auch ohne DTD. Eine DTD-Datei unterstützt den Ersteller der XML-Datei, die Datei korrekt aufzubauen. Die DTD-Datei ist gewissermassen eine Vorlage, wie die XML-Datei aufgebaut sein soll. Heute wird eher ein XML-Schema verwendet, das kommt im nächsten Kapitel an die Reihe.

Eine DTD-Datei für unsere Anmeldung würde etwa so aussehen:

<!ELEMENT Anmeldung (Event, Club, Teilnehmer+)>
<!ELEMENT Event (Nummer, Name, Disziplin)>
<!ELEMENT Club (ClubNr, ClubName, Trainer, Email, Software?)>
<!ELEMENT Teilnehmer (VorName, NachName, Jahrgang, Geschlecht, Punkte)>
<!ELEMENT Nummer (#PCDATA)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Disziplin (#PCDATA)>
<!ELEMENT ClubNr (#PCDATA)>
<!ELEMENT ClubName (#PCDATA)>
<!ELEMENT Trainer (#PCDATA)>
<!ELEMENT Email (#PCDATA)>
<!ELEMENT VorName (#PCDATA)>
<!ELEMENT NachName (#PCDATA)>
<!ELEMENT Jahrgang (#PCDATA)>
<!ELEMENT Geschlecht (#PCDATA)>
<!ELEMENT Punkte (#PCDATA)>
<!ENTITITY bfy "BFY">

* = 0-n
+ 1-n
? = 0-1
() = gruppieren
Attribut Name=Wert
#PCDATA

Ein DTD kann in der XML-Datei eingebaut oder in einer externen Datei sein. Bei einer externen Datei muss die XML-Datei auf die DTD Datei verweisen. Die ENTITY bfy ist hingegen in der XML-Datei definiert, sonst motzt Safari, etwa so:

<?xml version="1.0"?>

<!DOCTYPE Anmeldung SYSTEM "https://hanswittwer.ch/xml/anmeldung.dtd"
[
<!ENTITY bfy "BFY">
]>
<Anmeldung>
   <Event>
      <Nummer>234</Nummer>
      <Name …
   </Event>
   <Club>
      <Software>&bfy;</Software>
       …
    …

Für &bfy; wird automatisch BFY eingesetzt.

XML-Schema

Ein XML-Schema ist eine leistungsfähigere Alternative zu DTD. Eine Anleitung zum XSD-Schema findest Du auf der Site W3schools

Das XML-Schema für unsere Anmeldung könnte so aussehen:
Mit einem XML-Schema könntest Du den Gültigkeitsbereich der Werte einschränken, etwa den Jahrgang zwischen 1980 und 2010 einschränken. Oder dass es genau einen Jahrgang pro Teilnehmer bedarf. Wie oben erwähnt, funktioniert eine XML-Datei ohne DDT oder ohne XML-Schema. Und wenn auch keine Attribute nötig sind, würde ich JSON vorziehen.

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xs:complexType name="EventInfo">
      <xs:sequence>
         <xs:element name="Nummer" type="xs:integer" />
         <xs:element name="Name" type="xs:string" />
         <xs:element name="Disziplin" type="xs:integer" />
      </xs:sequence>
   </xs:complexType>

   <xs:element name="Anmeldung">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="Event" Type="EventInfo" />

            <xs:element name="Club">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="ClubNr" type="xs:integer" />
                     <xs:element name="ClubName" type="xs:string" />
                     <xs:element name="Trainer" type="xs:integer" />
                     <xs:element name="Email" type="xs:string" />
                  </xs:sequence>
               </xs:complexType>
            </xs:element>

            <xs:element name="Teilnehmer">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="VorName" type="xs:string" />
                     <xs:element name="NachName" type="xs:string" />
                     <xs:element name="Jahrgang" type="xs:integer" />
                     <xs:element name="Geschlecht" type="xs:string" />
                     <xs:element name="Punkte" type="xs:decimal" />
                  </xs:sequence>
               </xs:complexType>
            </xs:element>

         </xs:sequence>
      </xs:complexType>
   </xs:element>

</xs:schema>

Terminologie

<?xml version="1.0"?> | Deklaration.
<?xml version="1.0" encoding="UTF-8"?> | Deklaration mit Zeichenreferenz. Standard UTF-8, darum wird es oft nicht angegeben.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | Deklaration mit Zeichenreferenz und internem DTD. Nicht empfohlen.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | Deklaration mit Zeichenreferenz und externem DTD. XML-Schema empfohlen.

<!-- Das ist ein Kommentar --> | Kommentar.

<buch> | öffnendes Wurzelelement.
   <Titel></Titel> | leeres nElement Titel ohne Attribut und ohne Inhalt.
   <Titel>Rangliste</Titel> | nElement Titel mit dem Inhalt: Rangliste
   <Titel genre="A" jahr="2025"></Titel> | nElement Titel mit zwei Attributen: genre und jahr.
   <Titel genre="A" jahr="2025">Rangliste</Titel> | nElement Titel mit zwei Attributen: genre und jahr und dem Inhalt: Rangliste.
</buch> | Schliessendes Wurzelelement.

Jedes Element ist ein Knoten (node) und repräsentiert einen einzelnen Knoten im Objektbaum.

Eine XML-Datei benötigt ein Wurzelement (Root-Element), das den gesamten Objektbaum umschliesst. Der zweite und folgende Knoten sind nElementknoten.

Ein Element ist ein Tag. Tags sind durch spitze Klammern gekennzeichnet (<Tag>). Jedes Tag muss geschlossen werden (</Tag>).

JSON