Форматувати та робити відступи у XML

форматує XML-код у структурованому та читабельному вигляді, необхідному для читання ваших обмінів даними

Навіщо форматувати XML?

Форматування XML (також зване XML pretty print, XML відступ або XML форматування) полягає у реорганізації компактного або мінімізованого XML-документа у структуру з відступами, читабельну рядок за рядком. Добре відформатований XML покращує читабельність людиною, що є суттєвим при читанні SOAP-відповіді, перегляді RSS-потоку або інспекції файлу конфігурації.

Конкретно, XML форматується з чотирьох основних причин:

  • Debug: швидко знайти незакритий тег, відсутній атрибут або непослідовну структуру.
  • Ручна інтеграція: чисто скопіювати фрагмент у файл конфігурації без порушення наявного відступу.
  • Code review: порівняння двох версій XML-документа у Git diff стає читабельним, коли кожен тег знаходиться на власному рядку.
  • Документація та приклади: відформатований XML набагато більш дидактичний у технічній документації або README.

Типові випадки використання

XML залишається скрізь присутнім в екосистемі програмного забезпечення. Ось формати, на яких розробники найчастіше використовують XML-форматер:

  • SOAP-відповіді: конверти <soap:Envelope>, повернуті SOAP веб-сервісами, як правило мінімізовані.
  • RSS та Atom потоки: для інспекції або аудиту потоку синдикації.
  • Конфігурації Spring, Maven (pom.xml), Ant, Ivy: файли збірки та залежностей Java.
  • AndroidManifest.xml та інші XML-ресурси Android-проекту.
  • SVG-файли: векторна графіка, експортована з дизайн-програми, часто стиснута в один рядок.
  • Експорти e-commerce: потоки продуктів Google Shopping, експорти Magento, Shopify або PrestaShop.
  • Документи OOXML: файли .docx, .xlsx та .pptx є ZIP-архівами, що містять XML-файли, які часто потрібно інспектувати.
  • XML-сайтмапи: sitemap.xml, що обслуговуються пошуковим системам.

Як працює форматування XML

XML-форматер не просто додає пробіли навмання. Він виконує два кроки:

  1. Parsing: документ читається, потім перетворюється у дерево DOM (Document Object Model). Цей крок також перевіряє, що XML є добре сформованим (теги правильно вкладені, атрибути у лапках, один кореневий елемент).
  2. Індентований серіалізатор: дерево DOM повторно виводиться у вигляді тексту з переносами рядків між елементами та відступом, пропорційним глибині у дереві.

Цей підхід через дерево гарантує, що логічна структура документа залишається суворо ідентичною: змінюються лише незначущі пробіли між тегами. Секції CDATA, коментарі та інструкції обробки зберігаються.

Як користуватися XML-форматером

Процедура навмисно проста:

  1. Вставте ваш XML-документ у текстове поле або завантажте файл .xml.
  2. Підтвердіть форму: документ аналізується та автоматично виділяється відступами.
  3. Відформатований результат з'являється в зоні виведення. У разі помилки парсингу, повідомлення вказує характер та приблизне місце проблеми.
  4. Скопіюйте результат за допомогою відповідної кнопки або завантажте для безпосередньої інтеграції у ваш проект.

Найкращі практики відступів XML

Кілька угод для дотримання з метою виробляти чистий та довготривалий XML:

  • Відступ: 2 або 4 пробіли відповідно до угоди вашої команди. Залишайтеся послідовними у всьому проекті.
  • Переноси рядків: один елемент на рядок, що робить Git diff придатним для використання.
  • CDATA-секції: гарний форматер повністю зберігає блоки <![CDATA[ ... ]]> без переіндентації їхнього вмісту, який обробляється як сирий текст.
  • Кодування: завжди оголошуйте кодування у першому рядку з <?xml version="1.0" encoding="UTF-8"?>. UTF-8 є де-факто стандартом.
  • Атрибути: якщо елемент має багато атрибутів, деякі команди переносять їх на новий рядок для читабельності; інакше вони залишаються на тому самому рядку, що й відкриваючий тег.
  • Коментарі: <!-- ... --> повинні зберігатися форматером такими як є.

Приклад до/після

Ось конкретний приклад компактного XML, прикрашеного форматером.

До (один рядок, нечитабельний):

<root><item id="1">val</item><item id="2">val2</item></root>

Після (відформатований з 2 пробілами):

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <item id="1">val</item>
  <item id="2">val2</item>
</root>

Логічна структура є суворо ідентичною: змінюється лише візуальний порядок.

Повний приклад

Більший XML-документ після форматування виглядає так:

<?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>

Часті запитання

Що таке добре сформований XML?

XML вважається добре сформованим (well-formed), коли він дотримується основних синтаксичних правил: один кореневий елемент, правильно вкладені та закриті теги, атрибути у лапках, спеціальні символи екрановані (&amp;, &lt;, &gt;). Це є передумовою для парсингу документа. Не плутайте з дійсним XML, який додатково відповідає схемі XSD або DTD.

В чому різниця між форматуванням (pretty print) та мінімізацією XML?

Pretty print додає переноси рядків та відступи для читабельності людиною. Мінімізація робить зворотне: вона видаляє всі незначущі пробіли для зменшення розміру документа, що корисно для мережевого транзиту (SOAP-відповіді, XML API). Обидва документи є семантично еквівалентними.

Чи зберігаються коментарі та секції CDATA при форматуванні?

Так. Правильний форматер зберігає коментарі <!-- ... -->, секції <![CDATA[ ... ]]> та інструкції обробки (<? ... ?>). Вміст CDATA залишається незмінним без переіндентації, оскільки він обробляється як сирий текст. Перевіряйте результат, якщо ваші коментарі мають документаційне значення.

Чи обробляються XML-простори імен (xmlns)?

Так. Оголошення простору імен (xmlns:soap="...") та пов'язані префікси (<soap:Envelope>) зберігаються такими як є. Форматер не перейменовує префікси і не переміщує оголошення у дереві, що гарантує незмінність семантики документа. Простори імен за замовчуванням (без префіксу) також підтримуються на рівні оголошення.

Чи виділяти відступи пробілами або табуляціями?

Обидва варіанти працюють, але пробіли є домінантною угодою, оскільки вони відображаються однаково скрізь (термінали, браузери, Git diff). 2 або 4 пробіли залежно від складності вашого XML: 2 для дуже вкладених документів (SVG, конфігурації Spring), 4 для плоских документів. Головне залишається послідовність у всьому проекті.

Чи змінює форматер семантику документа?

Ні. Коригуються лише пробіли між тегами. Структура DOM, значення атрибутів та текстовий вміст елементів залишаються ідентичними. Виняток: значущий текстовий вміст (з xml:space="preserve") повинен зберігатися як є, перевіряйте цей аспект, якщо ваші дані містять смислові пробіли.

Чи можна валідувати XML одночасно з форматуванням?

Форматер вже виконує синтаксичну валідацію (добре сформований XML), оскільки він повинен парсити документ. Для валідації проти схеми XSD або DTD потрібен спеціальний інструмент: структурна валідація виходить за межі простого форматера. xmllint --schema або xerces підходять для цього додаткового кроку.

Приклад запиту

curl -X POST https://cdrn.fr/api/v1/tools/xml-formatter/execute \
  -H "Content-Type: application/json" \
  -d '{"input":"..."}'

Схема вхідних даних

Поле Тип Обов'язкове За замовчуванням
input text

Точки доступу

  • GET https://cdrn.fr/api/v1/tools - перелічує всі доступні інструменти
  • GET https://cdrn.fr/api/v1/tools/xml-formatter - отримує схему цього інструменту
  • POST https://cdrn.fr/api/v1/tools/xml-formatter/execute - виконує цей інструмент з JSON-payload