Инструмент форматирования XML
Что такое форматирование XML?
XML Formatter превращает сжатый или неаккуратный XML в структуру с отступами, которую легче читать. XML встречается в конфигурациях, SOAP-сообщениях, sitemap, RSS-лентах, офисных документах, build-артефактах и старых корпоративных интеграциях, где один пропущенный закрывающий тег или неправильно экранированный символ может остановить обработку. Инструмент помогает быстрее увидеть вложенные элементы, атрибуты, текстовые узлы, пространства имен и вероятные места ошибок. Он полезен для отладки, документации, сравнения и обучения, но не заменяет проверку схемы, если требуется конкретный XSD, API-контракт или партнерский формат. Форматирование улучшает читаемость, но не делает неверный XML правильным. Для production-данных или кодовой базы результат все равно нужно проверить parser, тестами или правилами проекта.
Инструкция по использованию
Инструкция по использованию
- Вставьте или введите XML-данные в левое поле ввода
- Выберите размер отступа (2 пробела, 4 пробела или табуляция)
- Нажмите «Форматировать» для красивого оформления или «Минимизировать» для удаления пробелов
- Результаты отображаются справа с подсветкой синтаксиса
- Нажмите «Копировать» или «Скачать» для сохранения результата
Примечания к XML
- Форматирование изменяет пробелы, а не смысл документа, но пробелы всё же могут иметь значение внутри текстовых узлов и документов со смешанным содержимым.
- Если разбор не удался, проверьте незакрытые теги, несоответствие вложенности, дублирующиеся атрибуты и неэкранированные символы, такие как амперсанды.
Применение
` (фича SGML, принятая в XML 1.0) сохраняются как есть, поэтому пустые элементы HTML внутри XHTML или RSS должны содержать косую черту; запись `
` тихо изменит страницу в парсерах HTML5. Секции CDATA, включая правило терминатора `]]>`, также сохраняются без раскрытия в сущности `&`.
Технический принцип
Форматирование XML основано на рекомендации W3C XML 1.0 (пятое издание). Разбор выполняется через `new DOMParser().parseFromString(src, 'application/xml')` (или `text/xml`), который возвращает Document, узлы которого соответствуют семи продукциям, определённым в спецификации: Element, Attr, Text, CDATASection, Comment, ProcessingInstruction и DocumentType. В отличие от HTML, XML-парсеры строги: несовпадающий тег, неэкранированный `&` или дублирующийся атрибут прерывают разбор, и DOMParser возвращает элемент `<parsererror>`, тело которого содержит строку и столбец. Серверные аналоги включают libxml2 (`xmllint --format`), `xml.etree.ElementTree` на Python, StAX/SAX на Java и `XmlReader` на .NET. Принтер сериализует DOM поузлово: каждый Element открывается на отдельной строке с отступом depth*indent, дочерние элементы рекурсивно обрабатываются с depth+1, закрывающий тег выравнивается с открывающим, а пустые элементы сворачиваются в самозакрывающееся сокращение `<foo/>`, которое §3.1 спецификации объявляет семантически эквивалентным `<foo></foo>`. Пять предопределённых сущностей всегда перекодируются в текстовых значениях и значениях атрибутов: `&` `<` `>` `"` `'`. Секции CDATA (`<![CDATA[ ... ]]>`) сохраняются дословно, поскольку они являются явным механизмом экранирования для содержимого, которое иначе потребовало бы кодирования сущностей; терминатор `]]>` не может появляться внутри блока CDATA согласно §2.7, что обеспечивается парсером. Инструкции обработки вроде `<?xml-stylesheet?>` и объявление XML `<?xml version="1.0" encoding="UTF-8"?>` сохраняются в прологе документа. Объявление DOCTYPE передаётся как единая строка. Две тонкости определяют основную сложность форматировщика. Во-первых, смешанное содержимое — элемент, содержащий одновременно текст и дочерние элементы, например `<p>Hello <b>world</b>!</p>`, — не может быть переформатирован с отступами без изменения инфосета документа, поскольку каждый пробельный символ в таком контексте является значимым текстовым узлом. Форматировщики определяют смешанное содержимое, проверяя, есть ли у Element непробельные текстовые дочерние узлы, и переключаются на однострочную сериализацию для этого поддерева. Во-вторых, объявления пространств имён (`xmlns`, `xmlns:prefix`) должны оставаться на элементе, где они впервые объявлены; их перемещение изменяет область видимости. Порядок атрибутов не является каноническим согласно спецификации, поэтому большинство форматировщиков применяют алфавитную сортировку, сохраняя любые начальные объявления `xmlns:*`. Разбор и сериализация выполняются за O(n) от длины документа; очень большие ленты обычно обрабатываются потоково через SAX, а не построением DOM в памяти.
- Спецификация: W3C XML 1.0 пятое издание (REC-xml-20081126); DOM строится через `DOMParser().parseFromString(src, 'application/xml')`, аналогично libxml2 или `xmllint --format` на сервере.
- Строгость по замыслу: несовпадающие теги, неэкранированные `&`/`<`, дублирующиеся атрибуты или недопустимые символы вызывают элемент `<parsererror>`; прощающее восстановление HTML не применяется.
- Пять предопределённых сущностей перекодируются в текстовых значениях и значениях атрибутов: `&` `<` `>` `"` `'`. Числовые ссылки на символы вроде ` ` сохраняются как есть.
- Самозакрывающийся `<foo/>` и `<foo></foo>` семантически идентичны согласно §3.1; секции CDATA сохраняются дословно и не могут содержать терминатор `]]>`.
- Смешанное содержимое (текст + дочерние элементы) не может быть переформатировано с отступами без изменения инфосета — принтер определяет значимые пробелы и сериализует такие поддеревья в строку.
- Объявления пространств имён (`xmlns`, `xmlns:prefix`) остаются на элементе первого объявления; их перемещение изменяет область видимости. Порядок атрибутов не является каноническим, поэтому типична стабильная сортировка (сначала xmlns, затем по алфавиту).
- Сложность: O(n) на разбор и O(n) на сериализацию для инструментов на основе DOM; большие документы обрабатываются потоково через SAX/StAX (xml.sax в Python, javax.xml.stream в Java) для избежания загрузки всего дерева в память.
Примеры
Базовые элементы
<!-- Вход (одна строка) -->
<book><title>XML Guide</title><author>Jane Doe</author><year>2024</year></book>
<!-- Выход (2 пробела) -->
<book>
<title>XML Guide</title>
<author>Jane Doe</author>
<year>2024</year>
</book>С атрибутами
<?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>Вложенная структура с пространствами имён и 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>Часто задаваемые вопросы
Что делает этот инструмент?
Форматирует XML с отступами для вложенных элементов, размещает каждый элемент на отдельной строке и выравнивает закрывающие теги. Удобно для разбора SOAP-ответов, RSS-лент, конфигурационных файлов и других XML-данных, которые пришли одной длинной строкой.
Проверяет ли он соответствие схеме?
Нет. Он форматирует любой well-formed XML, который вы вставите. Проверка по схеме (XSD, DTD, RELAX NG) требует отдельного инструмента. Об ошибках well-formedness (несовпадающие теги, пропущенные закрывающие скобки) сообщается, но страница их не исправит.
Сохраняет ли он порядок атрибутов?
Да. По спецификации порядок атрибутов в XML не значим, но форматтер сохраняет исходный порядок, чтобы не удивлять вас. Секции CDATA, комментарии и инструкции обработки также сохраняются.
Как обрабатываются пробелы?
Пробельные символы между элементами нормализуются (один элемент на строку с отступом). Пробелы внутри текстового содержимого по умолчанию сохраняются — содержимое элемента значимо. Атрибут xml:space='preserve' учитывается там, где он указан.
Можно ли минифицировать XML?
Некоторые сборки предлагают режим минификации, удаляющий пробелы между элементами. Будьте осторожны: значимые пробелы (текстовое содержимое, области с xml:space='preserve') должны сохраняться. Если в вашем XML есть форматированный текст, проверьте результат на полный цикл.
Загружается ли XML на сервер?
Нет. Парсинг и красивое форматирование выполняются в вашем браузере с помощью DOMParser и XMLSerializer (встроенных в браузер). Ничего не передаётся.
Как обстоит дело с пространствами имён XML?
Объявления пространств имён (xmlns) и элементы/атрибуты с префиксами форматируются ровно так, как написаны. Повторное объявление того же пространства имён во вложенных элементах сохраняется (некоторые валидаторы это учитывают, другие — нет).