XML-Formatierungstool
Was ist XML-Formatierung?
Der XML-Formatter wandelt komprimiertes oder unübersichtliches XML in eine eingerückte, besser lesbare Struktur um. XML wird für Konfigurationen, SOAP-Nachrichten, Sitemaps, RSS-Feeds, Office-Dateien, Build-Artefakte und viele ältere Integrationen genutzt; schon ein fehlendes schließendes Tag oder ein falsch maskiertes Zeichen kann Verarbeitung verhindern. Das Werkzeug hilft, verschachtelte Elemente, Attribute, Textknoten und Fehlerstellen schneller zu erkennen. Es eignet sich für Debugging, Dokumentation, Vergleich und Schulung, ersetzt aber keine fachliche Schema-Validierung, wenn ein bestimmtes XSD, eine API-Spezifikation oder ein Partnerformat eingehalten werden muss. Formatierung ändert die Lesbarkeit, nicht automatisch die Bedeutung. Besonders bei produktiven Daten oder Codebasen sollte das Ergebnis anschließend mit Parser, Tests oder Projektregeln geprüft werden.
Verwendung
So verwenden Sie
- Fügen Sie XML-Daten in das linke Eingabefeld ein oder geben Sie sie ein
- Wählen Sie die Einrückungsgröße (2 Leerzeichen, 4 Leerzeichen oder Tabulator)
- Klicken Sie auf Formatieren, um zu verschönern, oder auf Komprimieren, um Leerzeichen zu entfernen
- Ergebnisse werden rechts mit Syntaxhervorhebung angezeigt
- Klicken Sie auf Kopieren oder Herunterladen, um das Ergebnis zu speichern
XML-Hinweise
- Formatierung ändert Leerzeichen, nicht die Dokumentbedeutung, aber Leerzeichen können in Textknoten und gemischten Inhalt-Dokumenten dennoch wichtig sein.
- Wenn die Analyse fehlschlägt, überprüfen Sie nicht geschlossene Tags, falsche Verschachtelung, doppelte Attribute und nicht maskierte Zeichen wie &.
Anwendungsfälle
` (ein SGML-Feature, akzeptiert in XML 1.0 §3.1) bleibt erhalten, sodass HTML-Void-Elemente in XHTML oder RSS ihren Schrägstrich behalten müssen; ein `
` würde in HTML5-Parsern die gerenderte Seite stillschweigend verändern. CDATA-Abschnitte einschließlich der literalen `]]>`-Terminierungsregel bleiben ebenfalls unverändert, anstatt in `&`-Entities entschärft zu werden.
Technisches Prinzip
Die XML-Formatierung basiert auf der W3C-XML-1.0-Empfehlung (Fünfte Ausgabe). Das Parsing erfolgt über `new DOMParser().parseFromString(src, 'application/xml')` (oder `text/xml`), das ein Document zurückgibt, dessen Knoten den sieben in der Spezifikation definierten Produktionen entsprechen: Element, Attr, Text, CDATASection, Comment, ProcessingInstruction und DocumentType. Im Gegensatz zu HTML sind XML-Parser strikt: Ein nicht übereinstimmendes Tag, ein nicht maskiertes `&` oder ein doppeltes Attribut brechen das Parsing ab, und der DOMParser gibt ein `<parsererror>`-Element zurück, dessen Körper Zeile und Spalte enthält. Serverseitige Entsprechungen sind libxml2 (`xmllint --format`), Pythons `xml.etree.ElementTree`, Java's StAX/SAX und .NETs `XmlReader`. Der Printer serialisiert den DOM knotenweise: Jedes Element öffnet in einer eigenen Zeile bei depth*indent Leerzeichen, Kinder rekursivieren mit depth+1, das schließende Tag richtet sich am öffnenden Tag aus, und leere Elemente werden auf die selbstschließende Kurzform `<foo/>` reduziert, die laut §3.1 der Spezifikation semantisch äquivalent zu `<foo></foo>` ist. Fünf vordefinierte Entities werden in Text- und Attributwerten immer wieder kodiert: `&` `<` `>` `"` `'`. CDATA-Abschnitte (`<![CDATA[ ... ]]>`) werden wörtlich beibehalten, da sie die explizite Ausnahmemöglichkeit für Inhalte darstellen, die sonst eine Entity-Kodierung erfordern würden; der Terminator `]]>` darf gemäß §2.7 nicht innerhalb eines CDATA-Blocks vorkommen, was der Parser durchsetzt. Processing Instructions wie `<?xml-stylesheet?>` und die XML-Deklaration `<?xml version="1.0" encoding="UTF-8"?>` werden im Dokumentprolog beibehalten. Die DOCTYPE-Deklaration wird als einzelne Zeichenkette round-tripped. Zwei Feinheiten treiben den Großteil der Formatter-Komplexität. Erstens kann gemischter Inhalt – ein Element, das sowohl Text als auch Kindelemente enthält, wie `<p>Hello <b>world</b>!</p>` – nicht neu eingerückt werden, ohne das Dokument-Infoset zu verändern, da jedes Leerzeichen in solch einem Kontext ein signifikanter Textknoten ist. Formatter erkennen gemischten Inhalt, indem sie scannen, ob ein Element einen nicht-leerzeichenhaltigen Textknoten besitzt, und wechseln für diesen Teilbaum zu einer einzeiligen Serialisierung. Zweitens müssen Namespace-Deklarationen (`xmlns`, `xmlns:prefix`) auf dem Element verbleiben, wo sie erstmals deklariert werden; ein Verschieben ändert den Gültigkeitsbereich. Die Attributreihenfolge ist laut Spezifikation nicht kanonisch, weshalb die meisten Formatter eine alphabetische Sortierung anwenden und dabei führende `xmlns:*`-Deklarationen beibehalten. Parsing und Serialisierung sind O(n) über die Dokumentlänge; sehr große Feeds werden typischerweise über SAX gestreamt, anstatt einen DOM im Speicher aufzubauen.
- Spezifikation: W3C XML 1.0 Fünfte Ausgabe (REC-xml-20081126); der DOM wird über `DOMParser().parseFromString(src, 'application/xml')` erstellt, äquivalent zu libxml2 oder `xmllint --format` serverseitig.
- Strikt by Design: Nicht übereinstimmende Tags, nicht maskierte `&`/`<`, doppelte Attribute oder ungültige Zeichen lösen ein `<parsererror>`-Element aus; HTMLs fehlerverzeihende Wiederherstellung greift nicht.
- Fünf vordefinierte Entities werden in Text- und Attributwerten neu kodiert: `&` `<` `>` `"` `'`. Numerische Zeichenreferenzen wie ` ` werden unverändert beibehalten.
- Selbstschließendes `<foo/>` und `<foo></foo>` sind gemäß §3.1 semantisch identisch; CDATA-Abschnitte werden wörtlich beibehalten und dürfen den Terminator `]]>` nicht enthalten.
- Gemischter Inhalt (Text + Kindelemente) kann nicht neu eingerückt werden, ohne das Infoset zu ändern – der Printer erkennt signifikante Leerzeichen und serialisiert diese Teilbäume inline.
- Namespace-Deklarationen (`xmlns`, `xmlns:prefix`) verbleiben auf dem Element der Erstdeklaration; ein Verschieben ändert den Gültigkeitsbereich. Die Attributreihenfolge ist nicht kanonisch, daher ist eine stabile Sortierung (xmlns zuerst, dann alphabetisch) üblich.
- Komplexität: O(n) Parsing und O(n) Serialisierung für DOM-basierte Werkzeuge; große Dokumente werden über SAX/StAX gestreamt (xml.sax in Python, javax.xml.stream in Java), um den vollständigen Baum nicht in den Speicher laden zu müssen.
Beispiele
Grundlegende Elemente
<!-- Eingabe (eine Zeile) -->
<book><title>XML Guide</title><author>Jane Doe</author><year>2024</year></book>
<!-- Ausgabe (2 Leerzeichen) -->
<book>
<title>XML Guide</title>
<author>Jane Doe</author>
<year>2024</year>
</book>Mit Attributen
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="b001" lang="en" available="true">
<title>Effective XML</title>
<price currency="USD">29.99</price>
</book>
</catalog>Verschachtelte Struktur mit Namespaces und CDATA
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns:GetUser xmlns:ns="https://example.com/api">
<ns:UserId>10086</ns:UserId>
<ns:Script>
<![CDATA[ if (a < b && b > 0) { return true; } ]]>
</ns:Script>
</ns:GetUser>
</soap:Body>
</soap:Envelope>FAQ
Was macht das Tool?
Es formatiert XML lesbar, indem es verschachtelte Elemente einrückt, jedes Element in eine eigene Zeile setzt und schließende Tags ausrichtet. Praktisch, um SOAP-Antworten, RSS-Feeds, Konfigurationsdateien und andere XML-Payloads zu inspizieren, die als eine einzige riesige Zeile geliefert wurden.
Validiert es gegen ein Schema?
Nein. Es formatiert jedes wohlgeformte XML, das du einfügst. Schema-Validierung (XSD, DTD, RELAX NG) braucht ein eigenes Tool. Wohlgeformtheits-Fehler (nicht passende Tags, fehlende Schlusstags) werden gemeldet, aber die Seite repariert sie nicht.
Bleibt die Attributreihenfolge erhalten?
Ja. Die Reihenfolge von XML-Attributen ist laut Spec technisch nicht signifikant, aber der Formatter behält die Originalreihenfolge bei, damit es keine Überraschungen gibt. CDATA-Abschnitte, Kommentare und Processing Instructions bleiben ebenfalls erhalten.
Wie wird Whitespace behandelt?
Whitespace zwischen Elementen wird normalisiert (ein Element pro Zeile mit Einrückung). Whitespace innerhalb von Textinhalten bleibt standardmäßig erhalten - Elementinhalt ist signifikant. xml:space='preserve'-Attribute werden, wo vorhanden, beachtet.
Kann ich XML minifizieren?
Manche Builds bieten einen Minify-Modus, der Whitespace zwischen Elementen entfernt. Vorsicht: Whitespace, der signifikant war (Textinhalt, xml:space='preserve'-Bereiche), sollte erhalten bleiben. Teste den Round-Trip, wenn dein XML Rich-Text-Inhalte enthält.
Wird das XML hochgeladen?
Nein. Parsing und Pretty-Print laufen in deinem Browser über DOMParser und XMLSerializer (im Browser eingebaut). Es wird nichts übertragen.
Was ist mit XML-Namespaces?
Namespace-Deklarationen (xmlns) und Elemente/Attribute mit Präfix werden genau so formatiert, wie sie geschrieben sind. Erneute Deklarationen desselben Namespaces in verschachtelten Elementen werden beibehalten (manche Validatoren stört das, andere nicht).