XML Formatter
Форматируйте и красиво выводите XML с подсветкой синтаксиса
Входные данные XML
Отформатированный XML
Что такое форматирование XML?
Форматирование XML (также называемое XML pretty-printing или XML beautification) — это процесс добавления последовательных отступов и переносов строк в XML-документ, чтобы его иерархическая структура стала наглядной. Необработанный XML, получаемый из API, генераторов конфигураций или сериализаторов, нередко передаётся в одну строку без пробелов между тегами. XML-форматтер разбирает такой документ в дерево, а затем повторно сериализует его с предсказуемыми отступами. Результат визуально понятен и значительно проще для восприятия, при этом логическое содержимое документа не изменяется ни в малейшей степени.
Спецификация XML 1.0 (рекомендация W3C, пятое издание) определяет строгую грамматику: каждый открывающий тег должен иметь соответствующий закрывающий или быть самозакрывающимся, значения атрибутов должны быть заключены в кавычки, а пять символов (<, >, &, ", ') требуют экранирования через сущности. Форматтер должен соблюдать эти правила, добавляя лишь незначимые пробельные символы, которые не изменяют информационное множество (infoset) документа. Понимание этих правил принципиально важно: только так можно гарантировать, что отформатированный XML останется корректным и будет принят любым совместимым XML-процессором.
Отформатированный XML проще читать при ревью кода, проще сравнивать в системах контроля версий и проще отлаживать, когда сервис возвращает неожиданные данные. Сама операция форматирования не влечёт потерь: логическое содержимое документа остаётся идентичным, меняется только представление. Инструменты вроде git diff и платформы ревью запросов на слияние показывают только изменённые строки — последовательно расставленные отступы в 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?
Форматировать XML вручную трудоёмко и чревато ошибками, особенно в документах с глубокой вложенностью или смешанными пространствами имён. Браузерный форматтер даёт готовый результат менее чем за секунду, независимо от размера файла. В отличие от настольных программ или утилит командной строки, он не требует установки или настройки — достаточно открыть страницу и сразу приступить к работе.
Сценарии использования XML-форматтера
Справочник по предопределённым сущностям XML
XML резервирует пять символов для своего синтаксиса. Когда эти символы встречаются в текстовом содержимом или значениях атрибутов, они должны быть заменены предопределёнными ссылками на сущности. Корректный форматтер сохраняет эти сущности при форматировании.
| Символ | Роль в XML | Сущность |
|---|---|---|
| < | 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