Formater XML
Formatuj i upiększaj XML z podświetlaniem składni
Wejście XML
Sformatowany XML
Czym jest formatowanie XML?
Formatowanie XML (nazywane też upiększaniem lub czytelnym wydrukiem XML) to proces dodawania spójnych wcięć i podziałów wierszy do dokumentu XML, dzięki czemu jego hierarchiczna struktura staje się widoczna. Surowy XML z API, generatorów konfiguracji lub serializatorów jest często dostarczany jako pojedyncza linia bez białych znaków między tagami. Formater XML parsuje taki dokument w drzewo, a następnie ponownie go serializuje z przewidywalnym odstępem. Wynik jest przejrzysty wizualnie i znacznie łatwiejszy do zrozumienia, bez żadnych zmian w logicznej treści dokumentu.
Specyfikacja XML 1.0 (zalecenie W3C, wydanie piąte) definiuje ścisłą gramatykę, w której każdy otwierający tag musi mieć pasujący tag zamykający lub być samozamykający, atrybuty muszą być ujęte w cudzysłowy, a pięć znaków (<, >, &, ", ') wymaga zastąpienia encjami. Formater musi przestrzegać tych zasad, wstawiając jedynie nieistotne białe znaki, które nie zmieniają zbioru informacji dokumentu (infoset). Rozumienie tych zasad jest kluczowe, aby mieć pewność, że sformatowany XML pozostaje poprawny i może być przetwarzany przez wszystkie zgodne parsery XML.
Sformatowany XML jest łatwiejszy do czytania podczas przeglądu kodu, łatwiejszy do porównywania w systemie kontroli wersji i łatwiejszy do debugowania, gdy serwis zwraca nieoczekiwane dane. Sama operacja formatowania jest bezstratna: logiczna zawartość dokumentu pozostaje identyczna, zmienia się tylko prezentacja. Narzędzia takie jak git diff i platformy do przeglądu kodu pokazują tylko zmodyfikowane wiersze — spójnie wcięty XML zapewnia, że te różnice odzwierciedlają rzeczywiste zmiany, a nie szum reformatowania.
<catalog><book id="bk101"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date></book><book id="bk102"><author>Ralls, Kim</author><title>Midnight Rain</title><genre>Fantasy</genre><price>5.95</price><publish_date>2000-12-16</publish_date></book></catalog>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
</book>
</catalog>Dlaczego warto używać internetowego formatera XML?
Ręczne formatowanie XML jest podatne na błędy i powolne, zwłaszcza w przypadku dokumentów z głębokim zagnieżdżeniem lub mieszanymi przestrzeniami nazw. Formater działający w przeglądarce daje sformatowany wynik w mniej niż sekundę, niezależnie od rozmiaru pliku. W przeciwieństwie do narzędzi desktopowych lub wiersza poleceń nie wymaga żadnej instalacji ani konfiguracji — wystarczy otworzyć stronę i od razu zacząć pracować.
Zastosowania formatera XML
Encje predefiniowane XML
XML rezerwuje pięć znaków dla swojej składni. Gdy te znaki pojawiają się jako dosłowna treść tekstowa lub wartości atrybutów, muszą być zastąpione predefiniowanymi encjami. Poprawny formater zachowuje te encje podczas czytelnego wydruku.
| Znak | Rola w XML | Encja |
|---|---|---|
| < | Start of tag | < |
| > | End of tag | > |
| & | Start of entity | & |
| " | Attribute delimiter | " |
| ' | Attribute delimiter | ' |
Porównanie stylów wcięcia XML
Nie ma jednego standardu wcięcia XML. Wybór zależy od konwencji zespołu i narzędzi w potoku. Oto trzy najczęściej stosowane style.
Przykłady kodu: formatowanie XML programistycznie
Gdy potrzebujesz formatować XML wewnątrz skryptu lub procesu kompilacji, każdy główny język ma wbudowaną lub standardową opcję biblioteczną. W Pythonie można skorzystać z modułu xml.dom.minidom lub lxml, w Javie dostępny jest javax.xml.transform z obsługą wcięć, a w Node.js istnieją biblioteki takie jak xmldom lub prettier. Poniżej znajdują się działające przykłady, które możesz skopiować bezpośrednio.
const raw = '<root><item>hello</item></root>'
const parser = new DOMParser()
const doc = parser.parseFromString(raw, 'application/xml')
const serializer = new XMLSerializer()
const xml = serializer.serializeToString(doc)
// Indent with XSLT (browser-native approach)
const xslt = new DOMParser().parseFromString(`
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>`, 'application/xml')
const proc = new XSLTProcessor()
proc.importStylesheet(xslt)
const formatted = proc.transformToDocument(doc)
console.log(new XMLSerializer().serializeToString(formatted))
// → <root>\n <item>hello</item>\n</root>import xml.dom.minidom raw = '<root><item>hello</item><item>world</item></root>' dom = xml.dom.minidom.parseString(raw) print(dom.toprettyxml(indent=' ')) # → <?xml version="1.0" ?> # → <root> # → <item>hello</item> # → <item>world</item> # → </root> # With lxml (handles namespaces, XSD, large files) from lxml import etree tree = etree.fromstring(raw.encode()) print(etree.tostring(tree, pretty_print=True).decode())
package main
import (
"encoding/xml"
"fmt"
"strings"
)
func formatXML(raw string) (string, error) {
decoder := xml.NewDecoder(strings.NewReader(raw))
var out strings.Builder
encoder := xml.NewEncoder(&out)
encoder.Indent("", " ")
for {
tok, err := decoder.Token()
if err != nil {
break
}
encoder.EncodeToken(tok)
}
encoder.Flush()
return out.String(), nil
}
// formatXML("<a><b>1</b></a>") → "<a>\n <b>1</b>\n</a>"# Format XML file with xmllint (part of libxml2, pre-installed on macOS/Linux) xmllint --format input.xml > formatted.xml # Format from stdin echo '<a><b>1</b></a>' | xmllint --format - # → <?xml version="1.0"?> # → <a> # → <b>1</b> # → </a> # Validate and format at the same time xmllint --format --schema schema.xsd input.xml