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>).
