Einführung in XML
From NJH-Wiki
- Autor
- Volker Grabsch
Contents |
Einführung
Grundbegriffe: XML, DTD, XSL
Die Extensible Markup Language (XML) ist ein universelles Dateiformat, um textbasierte, hierarchisch aufgebaute Daten zu erfassen. Es ist vom World Wide Web Consortium (W3C) standardisiert.
Wie die Hierarchie einer XML-Datei auszusehen hat, bestimmt die DTD. Es gibt für viele Standard-Probleme bereits vorgefertigte DTDs:
- XHTML
- für Webseiten
- WML
- für WAP-Seiten
- SVG
- für Vektorgrafiken
- RDF
- für Dokument-Metadaten
- MathML
- für mathematische Formeln
- SMIL
- für Multimedia-Präsentationen
- XML
- FO : für druckbare Dokumente (wird meist in PDF umgewandelt)
- XSLT
- für XML-Stylesheets
- DTD
- für XML-Format-Beschreibungen
Ja, wirklich: auch DTDs selbst sind wiederum XML-Dateien. Klingt komisch, ist aber so. :-)
Man kann sich auch sein eigenes XML-Format definieren. Das ist oftmals sinnvoll, falls einem die bestehenden Formate nicht genügen, oder falls diese einem zu kompliziert sind. Für eine solche selbst-definierte XML-Datei muss man nicht unbedingt eine DTD schreiben, aber es ist ratsam.
Mit XSLT beschreibt man einen sogenannten Stylesheet. Ein Stylesheet ist nichts weiter als eine Beschreibung, wie man aus einer XML-Datei eine andere Datei generiert. Dabei kann folgendes herauskommen:
- XML
- Text
- HTML
Binärformate wie z.B. Word-Dokumente kann man also nicht mit XSLT erstellen.
XSLT erspart einem in vielen Fällen das Schreiben von Konvertierungs-Programmen. Da XSLT selbst wiederum ein XML-Format ist (siehe oben), kann ein Stylesheet selbst wiederum einen Stylesheet erzeugen. Dies ist aber nur begrenzt sinnvoll. ;-)
Beispiel: Anwendung von XML
Eine sinnvolle Anwendung wäre folgende: Man betrachte die Arbeit eines Kaninchenzüchters. Alle Tiere, die auf seinem Hof jemals das Licht der Welt erblickt haben, stehen in seinem Computer. Da läuft ein kleines nettes Verwaltungsprogramm, das ihm Stammbäume und ähnliches ausdrucken kann.
Ohne XML würde das Programm etwa so arbeiten:
/-> Tierliste anzeigen
|
|-> Tierliste ausdrucken
|
Programm --|-> Stammbaum anzeigen
|
|-> Stammbaum ausdrucken
|
|-> ...
Das Programm müsste sich um alles kümmern: Das Ansprechen des Druckers, Darstellen von Tabellen, und so weiter. Jede Erweiterung wäre eine neue programmtechnische Herausforderung. Und höchstwahrscheinlich wäre alles von der verwendeten Programmiersprache abhängig.
Will jemand anderes z.B. nur den Stammbaum-Ausdruck verschönern, müsste er dafür den Programmcode verstehen können. Das Erzeugen einer HTML- oder PDF-Version von einem Stammbaum wäre mit imenser Arbeit verbunden.
Mit XML könnte das Programm folgendes machen:
/-> (Stylesheet anwenden) ---------------> HTML-Tierliste
|
/-> Tierliste in XML --|
| | /-> PDF-Tierliste
| \-> (Stylesheet anwenden) --> XML:FO --|
| \-> Tierliste ausdrucken
|
Programm --|
|
|
| /-> (Stylesheet anwenden) ---------------> HTML-Stammbaum
| |
\-> Stammbaum in XML --|
| /-> PDF-Stammbaum
\-> (Stylesheet anwenden) --> XML:FO --|
\-> Stammbaum ausdrucken
Hier ist das Programm nur für das Erzeugen von XML-Beschreibungen zuständig. Es müssen dann noch die 4 Stylesheets in XSLT geschrieben werden, und der Rest läuft automatisch. Denn das Umwandeln von XML:FO in PDF, sowie das Ausdrucken von XML:FO, sind Standardaufgaben. Um diese braucht sich der Programmierer im Idealfall gar nicht mehr kümmern.
Will man nun die HTML-Tierliste verschönern, braucht man nur noch den einen Stylesheet umzuschreiben. Der Web-Designer braucht also keinen Programmcode anzufassen, stattdessen bearbeitet er eine XSLT-Datei, die seinem gewohnten HTML-Dateiformat sehr ähnlich ist.
Will der Züchter seine Tierliste als schickes LaTeX-Dokument, ist nur ein neuer Stylesheet nötig. LaTeX ist ein reines Text-Format, und kann daher direkt mit XSLT erzeugt werden. Praktisch kein Programmcode muss mehr angefasst werden.
Technische Beschreibung
Das XML-Dateiformat
TODO
Richtlinien für das eigene XML-Format
Der Text-Inhalt eines Elementes sollte direkt folgen, ohne Zeilenumbruch, ohne Leerzeichen:
| schlecht | besser |
|---|---|
<person>
<name>
Rumpelstielzchen
</name>
</person>
|
<person> <name>Rumpelstielzchen</name> </person> |
Dadurch erzeugt der Stylesheet keine unnötigen Leerzeichen, was uns einen Haufen Formatierungs-Probleme erspart.
Der XML-Code sollte für Einträge vom gleichen Typ auch gleichnamige Elemente enthalten, selbst wenn dies eine tiefere Hierarchie bedeutet:
| schlecht | besser |
|---|---|
<anfang>24.01.2004</anfang> <ende>24.01.2004</ende> |
<anfang> <datum>24.01.2004</datum> </anfang> <ende> <datum>24.01.2004</datum> </ende> |
Dadurch vereinfacht sich der Stylesheet, da nun eigenständige Templates für Datumsangaben o.Ä. verwendet werden können.
Leere Elemente sollten ganz weggelassen werden:
| schlecht | besser |
|---|---|
<zeitspanne> <anfang/> <ende>24.01.2004</ende> </zeitspanne> |
<zeitspanne> <ende>24.01.2004</ende> </zeitspanne> |
Dadurch vereinfacht sich der Stylesheet, da er i.A. mit weniger Fallunterscheidungen auskommt.
Bei Längeneinheiten, Zeitsangaben, Währungen, etc. sollten Attribute verwendet werden, welche die Einheit (Dollar, EUR, DM, ...) bzw. die Lokalisierung (GB, US, DE, FR, ...) angeben:
| schlecht | besser |
|---|---|
<preis> <amount>12,00€</amount> <preis> |
<preis> <amount unit="EUR">12,00</amount> </preis> |
Das erspart Probleme mit Sonderzeichen und erlaubt einheitenlose Tabellen.
Die länderspezifische Formatierung (localisation, l10n) sollte im XML-erzeugenden Programm passieren:
| schlecht | besser |
|---|---|
<geburt>
<date>
<year>2004</year>
<month>01</month>
<day>23</day>
</date>
</geburt>
|
<geburt> <date locale="EN">01/23/2004</date> <date locale="DE">23.01.2004</date> </geburt> |
Boolesche Werte (wahr/falsch) sollten durch Vorhandensein bzw. Nichtvorhandensein des Elements dargestellt werden:
| schlecht | besser |
|---|---|
<person> <name>Volker Grabsch</name> <child>no</child> </person> <person> <name>Baby Bruno</name> <child>yes</child> </person> |
<person> <name>Volker Grabsch</name> </person> <person> <name>Baby Bruno</name> <child/> </person> |
Informationen über das Geschlecht sind nicht boolesch.
Wiederkehrende, allgemeingültige Elemente und Attribute sollten englische Bezeichner erhalten:
| schlecht | besser |
|---|---|
<zeitspanne>
<anfang>
<datum>22.01.2004</datum>
</anfang>
<ende>
<datum>24.01.2004</datum>
</ende>
</zeitspanne>
|
<period>
<start>
<date>22.01.2004</date>
</start>
<end>
<date>24.01.2004</date>
</end>
</period>
|
Dadurch werden sie leichter internationalisierbar und es entfallen Bezeichner-Probleme mit Sonderzeichen.
Weitere Positiv-Beispiele:
<tattoo> <right>D789</right> <left>6.8.11</left> </tattoo>
<period>
<start>
<date locale="DE">25.01.2004</date>
<time locale="DE">22:35</time>
</start>
<end>
<date locale="DE">25.01.2004</date>
<time locale="DE">23:15</time>
</end>
</period>
<period>
<end>
<date locale="DE">25.01.2004</date>
</end>
</period>

