Конвертер XML в JSON
Вставьте XML слева, получите JSON справа. Атрибуты сохраняются с префиксом @_. Полностью в браузере — без загрузки.
- Вставьте XML в текстовое поле слева.
- Нажмите «Преобразовать в JSON». Вложенность элементов становится вложенными объектами.
- Скопируйте JSON или скачайте как data.json.
- Повторяющиеся дочерние элементы автоматически сворачиваются в массивы.
Что это делает?
Парсит 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 в командной строке — та же библиотека.