1. Einführung in XML
Obwohl JSON heute Standard ist, gibt es in der Java-Welt jede Menge Legacy-Code, daher können Sie mit XML in Berührung kommen. Es ist also sinnvoll, ein Verständnis dafür zu haben. XML (eXtensible Markup Language) ist ein textbasiertes Format zum Speichern und Austauschen strukturierter Daten. Es wird häufig für Konfigurationen, den Datenaustausch zwischen Programmen, die Datenspeicherung und sogar zur Serialisierung von Objekten verwendet.
Grundlegende Elemente der Struktur eines XML-Dokuments:
Tags (Elemente):
Alles, was sich zwischen < und > befindet. Jedes Tag wird geöffnet (<tag>) und geschlossen (</tag>) oder ist selbstschließend (<tag/>).
Attribute:
Zusätzliche Parameter innerhalb eines Tags.
Beispiel: <user name="John" age="25"/>
Textknoten:
Text zwischen Tags.
Beispiel: <greeting>Hallo, Welt!</greeting>
Beispiel eines einfachen XML-Dokuments
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="John" age="25">Hallo!</user>
<user name="Kate" age="30"/>
</users>
Hier:
- <users> – das Wurzelelement.
- <user> – ein Element mit den Attributen name und age; beim ersten Benutzer gibt es Textinhalt.
2. Schlüsselbegriffe
Prolog:
Die Zeile am Anfang der Datei gibt die XML-Version und die Kodierung an.
Beispiel: <?xml version="1.0" encoding="UTF-8"?>
Elemente:
Die grundlegenden Bausteine von XML.
Beispiel: <book>...</book>
Attribute:
Parameter im öffnenden Tag.
Beispiel: <book title="Java" author="Smith"/>
Kommentare:
Wie in HTML werden sie zwischen <!-- ... --> geschrieben.
Beispiel: <!-- Dies ist ein Kommentar -->
CDATA-Abschnitte:
Ermöglichen das Einfügen von Text, der nicht als XML interpretiert wird (z. B. mit den Zeichen <, & usw.).
Beispiel:
<script><![CDATA[
if (a < b && b > 0) { ... }
]]></script>
3. Warum werden Namespaces (Namensräume) in XML benötigt
Problem: Namenskonflikt
In großen XML-Dokumenten kommen oft identische Tag-Namen vor, die aber etwas Unterschiedliches bedeuten. Zum Beispiel gibt es <table> als Teil von HTML und <table> als Teil Ihrer Business-Logik (z. B. einer Datenbank). Wie erkennt man, welches Tag was bedeutet?
Ohne Namespace:
<root>
<table>
<row>...</row>
</table>
<table>
<column>...</column>
</table>
</root>
Hier ist unklar, welche <table> wozu gehört.
Lösung: Namespaces
Ein Namespace (Namensraum) ist eine Möglichkeit, Elemente und Attribute zu „markieren“, um Namenskonflikte zu vermeiden und die Bedeutung unterschiedlicher Tags klar zu trennen.
- Jeder Namespace ist ein eindeutiger URI (sieht meist wie ein Link aus, dient aber nur als Bezeichner).
- Elemente und Attribute mit unterschiedlichen Namespaces gelten als verschieden, auch wenn der Name identisch ist.
Vorteile:
- Keine Namenskonflikte zwischen verschiedenen Standards und Schemata.
- Daten aus unterschiedlichen Quellen können in einem Dokument kombiniert werden.
- Es ist klar ersichtlich, zu welchem „Vokabular“ jedes Tag gehört.
4. Verwendung von Namespaces: Deklaration und Anwendung
Wie deklariert man einen Namespace
Im öffnenden Tag eines Elements wird ein spezielles Attribut xmlns (XML Namespace) geschrieben:
- Ohne Präfix: xmlns="URI" – deklariert den Standard-Namensraum für alle verschachtelten Elemente.
- Mit Präfix: xmlns:prefix="URI" – deklariert einen Namensraum mit einem Kurznamen (Präfix), der für Tags verwendet wird.
Beispiel für Deklaration und Verwendung eines Namespace
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Zelle 1</h:td>
<h:td>Zelle 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Tisch</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Hier:
- xmlns:h="..." – deklariert das Präfix h für die HTML-Tabelle.
- xmlns:f="..." – deklariert das Präfix f für Möbel.
- <h:table> und <f:table> sind nun unterschiedliche Elemente, auch wenn der Name identisch ist.
Wie man einen Namespace verwendet
- Deklaration: Im Wurzel- oder jedem anderen Element: xmlns:prefix="URI"
- Anwendung: Vor dem Element- oder Attributnamen steht das Präfix und ein Doppelpunkt: <prefix:element>...</prefix:element>
Standard-Namensraum
Wenn man einfach xmlns="URI" deklariert, gehören alle Elemente ohne Präfix zu diesem Namespace.
<books xmlns="http://example.com/books">
<book>...</book>
</books>
5. Praxis: Erstellung eines einfachen XML-Dokuments mit mehreren Namespaces
Erstellen wir ein Beispiel-XML-Dokument, in dem zwei Namensräume verwendet werden: für HTML und für Möbel.
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Zelle 1</h:td>
<h:td>Zelle 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Tisch</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Was hier passiert:
- Im Wurzelelement sind zwei Namespaces deklariert: h und f.
- Alle Elemente mit dem Präfix h: gehören zur HTML-Tabelle.
- Alle Elemente mit dem Präfix f: gehören zu Möbeln.
6. Typische Fehler
Fehler 1: Präfix nicht deklariert
<root>
<h:table>...</h:table>
</root>
Ergebnis: Der XML-Parser meldet einen Fehler: The prefix 'h' for element 'h:table' is not bound.
Fehler 2: gleiche Namen ohne Namespace
<root>
<table>...</table>
<table>...</table>
</root>
Ergebnis: Es ist nicht erkennbar, welche <table> wozu gehört.
Fehler 3: falsche Verwendung des Präfixes
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>...</h:table>
<f:table>...</f:table> <!-- Fehler: Präfix f ist nicht deklariert -->
</root>
Ergebnis: Parser-Fehler: The prefix 'f' for element 'f:table' is not bound.
GO TO FULL VERSION