XML Formatter
Форматуйте та красиво відображайте XML із підсвічуванням синтаксису
XML-введення
Відформатований XML
Що таке форматування XML?
Форматування XML (також відоме як XML pretty-printing або XML beautification) — це процес додавання узгоджених відступів та переносів рядків до XML-документа, щоб зробити видимою його ієрархічну структуру. Необроблений XML, отриманий від API, генераторів конфігурацій або серіалізаторів, часто передається одним рядком без пробілів між тегами. XML-форматтер розбирає такий документ у дерево, а потім серіалізує його заново з передбачуваними відступами. Результат є візуально зрозумілим та значно простішим для сприйняття, при цьому логічний вміст документа залишається незмінним.
Специфікація XML 1.0 (Рекомендація W3C, п'яте видання) визначає суворий синтаксис: кожен відкривальний тег має мати відповідний закривальний або бути самозакривальним, атрибути мають бути взяті в лапки, а п'ять символів (<, >, &, ", ') потребують екранування за допомогою entity-посилань. Форматтер має дотримуватись цих правил, вставляючи лише незначні пробіли, що не змінюють інформаційний набір документа (infoset). Розуміння цих правил є принциповим для гарантії того, що відформатований XML залишається коректним та може бути оброблений будь-яким сумісним XML-процесором.
Відформатований XML легше читати під час рецензування коду, легше порівнювати у системі контролю версій та легше відлагоджувати, коли сервіс повертає неочікувані дані. Сама операція форматування є беззбитковою: логічний вміст документа залишається незмінним, змінюється лише подання. Такі інструменти як git diff та платформи рецензування pull-запитів показують лише змінені рядки — узгоджено відформатований XML гарантує, що ці відмінності відображають реальні зміни, а не шум від переформатування.
<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>Навіщо використовувати онлайн XML Formatter?
Форматування XML вручну є схильним до помилок і повільним, особливо для документів із глибокою вкладеністю або змішаними просторами імен. Форматтер у браузері дає відформатований результат менш ніж за секунду, незалежно від розміру файлу. На відміну від настільних програм або утиліт командного рядка, він не вимагає встановлення чи налаштування — просто відкрийте сторінку і одразу починайте роботу.
Сценарії використання XML Formatter
Довідник зарезервованих entity-посилань XML
XML резервує п'ять символів для свого синтаксису. Коли ці символи з'являються як текстовий вміст або значення атрибутів, їх слід замінювати наперед визначеними entity-посиланнями. Коректний форматтер зберігає ці entity під час форматування.
| Символ | Роль в XML | Entity |
|---|---|---|
| < | Start of tag | < |
| > | End of tag | > |
| & | Start of entity | & |
| " | Attribute delimiter | " |
| ' | Attribute delimiter | ' |
Порівняння стилів відступів XML
Єдиного стандарту для відступів XML не існує. Вибір залежить від угод вашої команди та інструментів у вашому пайплайні. Ось три найпоширеніші стилі.
Приклади коду: форматування XML програмно
Коли потрібно форматувати XML у скрипті або процесі збірки, кожна поширена мова програмування має вбудований або стандартний варіант. У Python підходить модуль xml.dom.minidom або lxml, у Java доступний javax.xml.transform із підтримкою відступів, а у Node.js є бібліотеки xmldom або prettier. Нижче наведено робочі приклади, які можна копіювати безпосередньо.
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