Formatuj i wcinaj XML
- Panel
- Dokumentacja
- API
Dlaczego formatować XML?
Formatowanie XML (zwane też formatowaniem XML, wcięciem XML lub pretty print) polega na reorganizacji zwartego lub zminifikowanego dokumentu XML w wciętą strukturę, czytelną linia po linii. Dobrze sformatowany XML poprawia czytelność, co jest niezbędne, gdy trzeba przeczytać odpowiedź SOAP, przejrzeć kanał RSS lub sprawdzić zawartość pliku konfiguracyjnego.
Konkretnie formatujemy XML z czterech głównych powodów:
- Debugowanie: szybkie zlokalizowanie niezamkniętego tagu, brakującego atrybutu lub niespójnej struktury.
- Ręczna integracja: czyste skopiowanie fragmentu do pliku konfiguracyjnego bez psucia istniejącego wcięcia.
- Code review: porównanie dwóch wersji dokumentu XML w diffie Git staje się czytelne, gdy każdy tag jest na własnej linii.
- Dokumentacja i przykłady: sformatowany XML jest znacznie bardziej dydaktyczny w dokumentacji technicznej lub README.
Typowe przypadki użycia
XML pozostaje wszechobecny w ekosystemie oprogramowania. Oto formaty, na których programiści najczęściej używają formatera XML:
- Odpowiedzi SOAP: koperty
<soap:Envelope>zwracane przez usługi sieciowe SOAP zazwyczaj przychodzą zminifikowane. - Kanały RSS i Atom: do sprawdzenia lub audytu kanału syndykacji.
- Konfiguracje Spring, Maven (
pom.xml), Ant, Ivy: pliki budowania i zależności Java. AndroidManifest.xmli inne zasoby XML projektu Android.- Pliki SVG: grafika wektorowa wyeksportowana z oprogramowania projektowego jest często skompresowana w jednej linii.
- Eksporty e-commerce: kanały produktów Google Shopping, eksporty Magento, Shopify lub PrestaShop.
- Dokumenty OOXML: pliki
.docx,.xlsxi.pptxto archiwa ZIP zawierające pliki XML, które często trzeba sprawdzić. - Sitemapy XML: pliki
sitemap.xmlserwowane wyszukiwarkom.
Jak działa formatowanie XML
Formater XML nie ogranicza się do dodawania spacji na chybił trafił. Wykonuje dwa kroki:
- Parsowanie: dokument jest czytany, a następnie przekształcany w drzewo DOM (Document Object Model). Ten krok również waliduje, że XML jest poprawnie sformowany (tagi prawidłowo zagnieżdżone, atrybuty w cudzysłowach, jeden element główny).
- Wcięta serializacja: drzewo DOM jest ponownie emitowane jako tekst ze znakami nowej linii między elementami i wcięciem proporcjonalnym do głębokości w drzewie.
To podejście drzewiaste gwarantuje, że logiczna struktura dokumentu pozostaje ściśle identyczna: modyfikowane są tylko nieznaczące spacje między tagami. Sekcje CDATA, komentarze i instrukcje przetwarzania są zachowywane. Bardziej zaawansowane transformacje (XSLT) lub zapytania (XPath) zresztą operują na tym samym drzewie DOM.
Jak korzystać z formatera XML
Procedura jest celowo prosta:
- Wklej swój dokument XML w polu tekstowym lub prześlij plik
.xml. - Wyślij formularz: dokument jest analizowany i automatycznie wcinany.
- Sformatowany wynik pojawia się w obszarze wyjścia. W przypadku błędu parsowania komunikat wskaże naturę i przybliżoną pozycję problemu.
- Skopiuj wynik dedykowanym przyciskiem lub pobierz go, aby bezpośrednio zintegrować w swoim projekcie.
Dobre praktyki wcięć XML
Kilka konwencji do przestrzegania, aby produkować czysty i trwały XML:
- Wcięcie: 2 lub 4 spacje zgodnie z konwencją twojego zespołu. Bądź spójny w całym projekcie.
- Znaki nowej linii: jeden element na linię, co czyni diffy Git użytecznymi.
- Sekcje CDATA: dobry formater w pełni zachowuje bloki
<![CDATA[ ... ]]>bez ponownego wcinania ich zawartości, która jest traktowana jako surowy tekst. - Kodowanie: zawsze deklaruj kodowanie w pierwszej linii za pomocą
<?xml version="1.0" encoding="UTF-8"?>. UTF-8 to standard de facto. - Atrybuty: jeśli element ma wiele atrybutów, niektóre zespoły przenoszą je do nowej linii dla czytelności, w przeciwnym razie pozostają na tej samej linii co tag otwierający.
- Komentarze:
<!-- ... -->muszą być zachowane bez zmian przez formater.
Przykład przed / po
Oto konkretny przykład zwartego XML uładnionego przez formater.
Przed (jedna linia, nieczytelne):
<root><item id="1">val</item><item id="2">val2</item></root>
Po (sformatowane z 2 spacjami):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="1">val</item>
<item id="2">val2</item>
</root>
Logiczna struktura jest ściśle identyczna: zmienia się tylko wizualne ułożenie.
Pełny przykład
Bardziej obszerny dokument XML po formatowaniu wygląda tak:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<user id="12345">
<name>John Doe</name>
<email>johndoe@example.com</email>
<address>
<street>123 Main St</street>
<city>Springfield</city>
<state>IL</state>
<postalCode>62704</postalCode>
<country>USA</country>
</address>
<phoneNumbers>
<phoneNumber type="home">555-1234</phoneNumber>
<phoneNumber type="work">555-5678</phoneNumber>
</phoneNumbers>
<preferences>
<newsletter>true</newsletter>
<theme>dark</theme>
</preferences>
<lastLogin>2024-06-14T09:30:00Z</lastLogin>
</user>
</root>
Najczęściej zadawane pytania
Czym jest poprawnie sformowany XML?
XML jest poprawnie sformowany (well-formed), gdy przestrzega podstawowych reguł składniowych: pojedynczy element główny, tagi prawidłowo zagnieżdżone i zamknięte, atrybuty w cudzysłowach, znaki specjalne escapowane (&, <, >). To warunek wstępny, aby móc parsować dokument. Nie należy mylić z XML poprawnym, który dodatkowo przestrzega schematu XSD lub DTD.
Jaka jest różnica między formatowaniem (pretty print) a minifikacją XML?
Pretty print dodaje znaki nowej linii i wcięcia dla czytelności dla człowieka. Minifikacja robi odwrotnie: usuwa wszystkie nieznaczące spacje, aby zmniejszyć rozmiar dokumentu, co jest przydatne dla transferu sieciowego (odpowiedzi SOAP, API XML). Oba dokumenty są semantycznie równoważne.
Czy komentarze i sekcje CDATA są zachowywane podczas formatowania?
Tak. Prawidłowy formater zachowuje komentarze <!-- ... -->, sekcje <![CDATA[ ... ]]> oraz instrukcje przetwarzania (<? ... ?>). Zawartość CDATA pozostaje nienaruszona bez ponownego wcinania, ponieważ jest traktowana jako surowy tekst. Sprawdź wynik, jeśli twoje komentarze mają znaczenie dokumentacyjne.
Czy namespacy XML (xmlns) są obsługiwane?
Tak. Deklaracje namespace (xmlns:soap="...") i powiązane prefiksy (<soap:Envelope>) są zachowywane w niezmienionej formie. Formater nie zmienia nazw prefiksów ani nie przemieszcza deklaracji w drzewie, co gwarantuje, że semantyka dokumentu pozostaje identyczna. Domyślne namespacy (bez prefiksu) są również utrzymywane na poziomie ich deklaracji.
Czy wcinać spacjami czy tabulatorami?
Oba działają, ale spacje to dominująca konwencja, ponieważ wyświetlają się identycznie wszędzie (terminale, przeglądarki, diff Git). 2 lub 4 spacje w zależności od gadatliwości XML: 2 dla bardzo zagnieżdżonych dokumentów (SVG, konfiguracje Spring), 4 dla płaskich dokumentów. Najważniejsza pozostaje spójność w całym projekcie.
Czy formater modyfikuje semantykę dokumentu?
Nie. Modyfikowane są tylko białe znaki między tagami. Struktura DOM, wartości atrybutów i zawartość tekstowa elementów pozostają identyczne. Wyjątek: znacząca zawartość tekstowa (z xml:space="preserve") musi być zachowana w niezmienionej formie, sprawdź ten aspekt, jeśli twoje dane zawierają spacje niosące znaczenie.
Czy można walidować XML jednocześnie z formatowaniem?
Formater wykonuje już walidację składniową (poprawnie sformowany XML), ponieważ musi parsować dokument. Do walidacji względem schematu XSD lub DTD potrzebne jest dedykowane narzędzie: walidacja strukturalna wykracza poza zakres prostego formatera. xmllint --schema lub xerces nadają się do tego dodatkowego kroku.
Przykładowe zapytanie
curl -X POST https://cdrn.fr/api/v1/tools/xml-formatter/execute \
-H "Content-Type: application/json" \
-d '{"input":"..."}'
Schemat wejściowy
| Pole | Typ | Wymagane | Domyślnie |
|---|---|---|---|
input |
text | ✓ | – |
Punkty końcowe
GET https://cdrn.fr/api/v1/tools- lista wszystkich dostępnych narzędziGET https://cdrn.fr/api/v1/tools/xml-formatter- zwraca schemat dla tego narzędziaPOST https://cdrn.fr/api/v1/tools/xml-formatter/execute- uruchamia to narzędzie z payloadem JSON