Конвертер XML в JSON
Что такое преобразование XML в JSON?
XML to JSON преобразует XML-разметку в JSON-структуру, чтобы данные было проще использовать в JavaScript, API, no-code инструментах и современных data pipelines. Отображение не всегда очевидно, потому что XML содержит элементы, атрибуты, текстовые узлы, namespaces, порядок и повторяющиеся узлы, а JSON работает с объектами, массивами и простыми значениями. Инструмент полезен для legacy-интеграций, SOAP-ответов, sitemap, RSS, конфигураций и тестовых данных. В production нужно внимательно проверять атрибуты, пустые элементы, mixed content, namespaces и распознавание массивов. Успешно распарсенный JSON не гарантирует, что вся бизнес-информация сохранена в нужной форме. Для production-данных или кодовой базы результат все равно нужно проверить parser, тестами или правилами проекта.
Инструкция по использованию
Инструкция по использованию
- Вставьте или введите XML-данные в левое поле ввода
- Выберите размер отступа (2 пробела, 4 пробела или табуляция)
- Преобразованный JSON отображается справа с подсветкой синтаксиса
- Проверьте результат преобразования и исправьте любые ошибки XML
- Нажмите «Копировать» или «Скачать» для сохранения результата
Примечания к структуре данных
- XML-атрибуты, повторяющиеся узлы, пространства имён и смешанный текст могут отображаться в JSON несколькими допустимыми способами; проверьте сгенерированную структуру перед использованием.
- Для миграции API определите правило сопоставления полей, а не полагайтесь на один пример преобразования.
Применение
Технический принцип
Конвертация начинается с встроенного в браузер XML-парсера. `new DOMParser().parseFromString(xmlString, 'application/xml')` возвращает `Document`, соответствующий W3C DOM Level 3 Core, проверяет корректность структуры по XML 1.0 (пятое издание) и представляет результат в виде дерева узлов `Element`, `Attr`, `Text`, `CDATASection` и `Comment`. Если входные данные некорректны, парсер не выбрасывает исключение — он возвращает документ, корневым элементом которого является `<parsererror>`, содержащий расположение и причину, поэтому конвертер сначала проверяет `doc.querySelector('parsererror')` и выводит это сообщение вместо создания частичного JSON. Преобразование дерева в JSON обходит документ в глубину и следует конвенции в стиле Badgerfish. Каждый элемент становится свойством, ключом которого является локальное имя; дочерние элементы становятся вложенными объектами; атрибуты элементов выравниваются с префиксом `@` (напр. `<user id="7">` → `{ "user": { "@id": "7" } }`); текстовое содержимое, соседствующее с дочерними элементами, сохраняется под ключом `#text`. Повторяющиеся sibling-элементы с одинаковым именем сворачиваются в массив JSON: два узла `<item>` становятся `"item": [ ... ]`, но одиночный `<item>` остаётся простым объектом — это известная неоднозначность «один или много», поскольку XML не может отличить список из одного элемента от скалярного значения, тогда как JSON рассматривает `"item": {...}` и `"item": [{...}]` как разные структуры. Некоторые возможности XML не имеют чистого эквивалента в JSON и намеренно теряют данные. Порядок элементов сохраняется в XML, но не гарантируется порядком ключей объекта JSON во всех потребителях (хотя ES2015 указывает порядок вставки для строковых ключей, схемы вроде JSON Schema не ограничивают его). Смешанное содержимое вроде `<p>Hello <b>world</b>!</p>` чередует текст с элементами и не может быть обратимо преобразовано в простую модель ключ-значение. Пространства имён XML в нотации Clark (`{http://example.com/ns}user`) сводятся к локальному имени `user`, что может конфликтовать с несвязанным элементом с тем же именем. Блоки CDATA вроде `<![CDATA[<raw>]]>` разворачиваются в обычный текст. Инструкции обработки (`<?xml-stylesheet ...?>`), комментарии (`<!-- ... -->`) и объявление XML отбрасываются, так как в JSON нет для них синтаксиса. Форматирование отступов выполняется через `JSON.stringify(value, null, indent)` с 2 пробелами, 4 пробелами или `'\t'`.
- Парсер: `new DOMParser().parseFromString(xml, 'application/xml')` согласно W3C DOM Level 3 Core; ошибки появляются как корневой элемент `<parsererror>`, а не как выброшенное исключение.
- Конвенции отображения: `@attr` для атрибутов в стиле Badgerfish, `#text` для смешанного текста, локальное имя элемента для дочерних узлов; Parker отбрасывает атрибуты, Spark сохраняет их в `$`.
- Повторяющиеся дочерние элементы с одинаковым именем сворачиваются в массив JSON; одиночный дочерний элемент остаётся объектом — классическая неоднозначность «один или много» не имеет решения на стороне XML.
- Потеряемые возможности: атрибуты (без префикса `@`), пространства имён (`xmlns:foo`), инструкции обработки, комментарии, объявление XML и обёртки CDATA.
- Смешанное содержимое (`<p>Hello <b>world</b>!</p>`) не может быть обратимо преобразовано в JSON ключ-значение; порядок элементов может быть потерян у потребителей, не сохраняющих порядок ключей.
- Приведение к числу/булеву значению — осознанный выбор: `<age>30</age>` может стать `30` (число) или `"30"` (строка); ведущие нули (`007`) должны оставаться строками.
- Форматирование вывода выполняется через `JSON.stringify(value, null, indent)` с отступом в 2 пробела, 4 пробела или `'\t'`; результат — UTF-8 без BOM.
Примеры
Простой элемент
<root>
<name>John</name>
</root>
→
{"root": {"name": "John"}}Повторяющиеся элементы
<root>
<item>A</item>
<item>B</item>
</root>
→
{"root": {"item": ["A", "B"]}}Вложенная структура
<root>
<user>
<name>John</name>
<age>30</age>
</user>
</root>
→
{"root": {"user": {"name": "John", "age": 30}}}Часто задаваемые вопросы
Как элементы XML отображаются в JSON?
Каждый элемент становится свойством JSON, значение которого — содержимое элемента (строка или вложенный объект). Повторяющиеся элементы с одним именем превращаются в массивы. Атрибуты обычно получают префикс «@» или хранятся под специальным ключом, например «$». Конкретное соглашение варьируется и обычно настраивается.
Почему преобразование XML в JSON иногда теряет данные?
XML различает элементы, атрибуты, текстовое содержимое, смешанное содержимое (текст и элементы), пространства имён, инструкции обработки и комментарии. В JSON есть только объекты, массивы, строки, числа, булевы значения и null. Отображение более богатого дерева XML на JSON теряет информацию о порядке и о различии элемент/атрибут.
Как обрабатывается смешанное содержимое (текст + дочерние элементы)?
Hello world!
не имеет аккуратного представления в JSON. Обычно страница использует специальный ключ (например, «#text» или «$») для свободного текста, но порядок между текстом и элементами не всегда сохраняется. Избегайте смешанного содержимого, если планируете обратное преобразование.Что с пространствами имён XML?
Элементы с префиксами (<ns:foo>) превращаются в строковые ключи «ns:foo» либо разделяются на свойства ns/локальное-имя. Объявления xmlns могут сохраняться как свойства-атрибуты или отбрасываться — зависит от настроек страницы.
Можно ли получить из JSON идентичный XML?
В общем случае обратное преобразование без потерь невозможно, особенно для смешанного содержимого, комментариев, инструкций обработки и порядка атрибутов. Для XML с чисто данными (конфиги, простые записи) обратный путь обычно работает. Для документного XML (DocBook, HTML, RSS) используйте настоящий XML-парсер.
Пустой элемент <foo/> — это то же самое, что <foo></foo>?
Да, для парсера. Оба варианта дают свойство foo с пустой строкой или null в качестве значения. Самозакрывающийся синтаксис в XML — чисто косметика.
Преобразование выполняется локально?
Да. Парсинг XML и генерация JSON происходят в вашем браузере. Страница не загружает ваши данные.