Конвертер XML в JSON

Вставьте XML слева, получите JSON справа. Атрибуты сохраняются с префиксом @_. Полностью в браузере — без загрузки.

  1. Вставьте XML в текстовое поле слева.
  2. Нажмите «Преобразовать в JSON». Вложенность элементов становится вложенными объектами.
  3. Скопируйте JSON или скачайте как data.json.
  4. Повторяющиеся дочерние элементы автоматически сворачиваются в массивы.
Что это делает?

Парсит XML в объект JSON по соглашениям fast-xml-parser: дочерние элементы становятся свойствами объекта, повторяющиеся дети — массивами, атрибуты сохраняются с префиксом `@_` на родительском объекте, текстовое содержимое смешанных узлов попадает в ключ `#text`. Числовые и булевы значения атрибутов автоматически типизируются через `parseAttributeValue: true` — XML `count="42"` ходит туда-обратно как `"@_count": 42`, а не строка `"42"`.

Пример

Вход XML:

<root version="1">
  <name>Ada</name>
  <tags>math</tags>
  <tags>logic</tags>
</root>

Выход JSON:

{
  "root": {
    "@_version": 1,
    "name": "Ada",
    "tags": ["math", "logic"]
  }
}

Типичные ловушки XML и как их обрабатывать

У XML есть угловые случаи, которых нет в JSON. Вот шаблоны, дающие неожиданный вывод.

  • Один ребёнок vs. несколько детей. `<a><b/></a>` даёт `{"a":{"b":""}}` (один ребёнок как свойство объекта), а `<a><b/><b/></a>` — `{"a":{"b":["",""]}}` (несколько как массив). Если код ниже всегда ждёт массив, нормализуйте после конвертации.
  • Атрибуты vs. дочерние элементы. Атрибуты появляются с префиксом `@_` на одном уровне с детьми. `<user id="1"><name>Ada</name></user>` становится `{"user":{"@_id":1,"name":"Ada"}}`. Некоторые инструменты сливают атрибуты в свойства — это иное соглашение, чем здесь.
  • Смешанное содержимое (текст + дочерние элементы). `<p>Hello <b>world</b></p>` даёт `{"p":{"#text":"Hello ","b":"world"}}`. Текст захватывается, но его позиция относительно детей теряется — JSON не умеет представлять упорядоченное смешанное содержимое. Большинство конфигурационного XML не попадает в этот случай.
  • Пространства имён. Пространства имён (`<x:foo xmlns:x="...">`) сохраняются как часть имени элемента (`x:foo`). Многие потребители XML отбрасывают префикс; если нужно — делайте это шагом постобработки.
  • Секции CDATA. `<![CDATA[some text]]>` парсится как обычный текст и присоединяется к `#text` родителя. Обрамление CDATA теряется — нормально для большинства случаев, но стоит помнить, если обрамление было семантически значимым.
  • Самозакрывающийся vs. пустой. `<x/>` и `<x></x>` эквивалентны в XML и дают одинаковый JSON-вывод (значение `""`). Исходное обрамление по JSON не восстанавливается.
Часто задаваемые вопросы

Почему у меня в выводе префикс `@_` на атрибутах?

Он отличает XML-атрибуты от дочерних элементов. Без префикса у `<user id="1"><id>foo</id></user>` было бы два ключа `id` — JSON-объект может иметь только один. Префикс делает оба round-trip-совместимыми. Если префикс не нужен, замените `"@_"` на `""` в постобработке (приняв риск коллизий).

Можно получить JSON без обёртывающего корневого ключа?

У XML всегда один корневой элемент. JSON сохраняет эту обёртку для round-trip. Снимайте её после конвертации, если хотите внутренний объект — `result.root` вместо `result`.

Сохраняются ли XML-комментарии?

Нет. У JSON нет синтаксиса комментариев, и парсер настроен игнорировать XML-комментарии. Чтобы сохранить комментарии, нужно использовать другое промежуточное представление, которое их поддерживает.

Типизируются ли значения атрибутов?

Да — установлен `parseAttributeValue: true`, поэтому `count="42"` становится `"@_count": 42` (число), а `enabled="true"` — `"@_enabled": true` (булева). Если нужно, чтобы атрибуты были строками, постобработайте или измените конфигурацию.

Загружается ли мой XML куда-то?

Нет. Всё работает в вашем браузере — ваш XML парсится JavaScript на этой странице и не отправляется ни на какой сервер. Проверьте в DevTools браузера.

Может ли он обрабатывать очень большие XML-файлы?

До примерно 30 МБ, прежде чем текстовая область замедлится. Парсер масштабируется линейно. Для больших входов запускайте fast-xml-parser в командной строке — та же библиотека.