Перейти к содержимому

Направление конвертации

Конвертация XML в JSON

Преобразование XML → JSON на сервере, без установки программ

.xml.json

.xml.json
  1. Загрузить
  2. Выбрать формат
  3. Скачать

Загрузка файлов

Область приёма файла

или

Файлы XML. До 5 МБ, до 20 файлов за раз. Изображение можно вставить из буфера обмена: Ctrl+V.

Дерево тегов превращается в объекты, атрибуты получают префикс @, а текст внутри тега с атрибутами — поле #text. Повторяющиеся теги собираются в массив. Комментарии и инструкции обработки отбрасываются.

Исходники и результаты хранятся 60 минут, затем стираются фоновым уборщиком. Предельный размер файла — 5 МБ, срок хранения — час.

XML и JSON: характеристики

Характеристики форматов XML и JSON рядом
Характеристика.xmlXML.jsonJSON
Полное названиеExtensible Markup LanguageJavaScript Object Notation
РазработчикW3CДуглас Крокфорд
Год появления19982001
Расширение.xml.json
MIME-типыapplication/xml, text/xmlapplication/json, text/json, application/x-json
СодержимоеТекстовоеТекстовое
Несколько страниц в файлеНетНет
СхемыXSD, DTD, RELAX NGнет данных
Пространства имёнПоддерживаютсянет данных
ОбработкаXPath, XSLT, XQueryнет данных
КодировкаОбъявляется в прологе документаUTF-8
МногословностьВыше, чем у JSONнет данных
Чем открытьVS Code, Notepad++, XMLSpy, JetBrains IDE, Mozilla Firefox, xmllintVS Code, Notepad++, Sublime Text, JetBrains IDE, Google Chrome, jq
СпецификацияОписание форматаОписание формата
Типы данныхнет данныхСтрока, число, логическое, null, массив, объект
Стандартнет данныхRFC 8259 / ECMA-404
Комментариинет данныхНе поддерживаются
Схеманет данныхОпционально, через JSON Schema

Преобразование XML → JSON

Информационное множество XML богаче модели значений JSON: в нём есть порядок узлов, атрибуты, пространства имён, комментарии, инструкции обработки и объявление типа документа. Что из этого сохраняется по явному правилу, а что отбрасывается, известно заранее и перечислено ниже. Отсюда следует главное: обратный перевод даёт корректный, но не тождественный документ.

Элемент становится полем объекта, вложенные узлы — вложенными объектами. Имя атрибута получает в начале символ @: без такой пометки атрибут был бы неотличим от дочернего узла, поскольку оба превращаются в обычные поля. Текстовое содержимое узла, у которого есть атрибуты или потомки, уходит в отдельное поле #text — положить строку туда, где уже находятся другие поля, нельзя. Префикс пространства имён сохраняется в ключе: без него элементы из разных словарей слились бы в один.

Отбрасывается то, чему в целевой модели места нет: комментарии, инструкции обработки, объявление DOCTYPE вместе с определениями сущностей, а также отступы и переводы строк между узлами — они относятся к оформлению файла, а не к его данным. Отказ от DOCTYPE попутно закрывает два известных способа нагрузить разборщик: подстановку внешнего ресурса по объявленной сущности и рекурсивное разрастание вложенных определений. Раздел CDATA превращается в обычную строку — экранирование в целевом формате устроено иначе, и специальные символы сохраняются сами по себе.

Неоднозначность остаётся ровно одна, и о ней стоит помнить при разборе результата. Массив опознаётся по факту повтора соседних узлов, поэтому перечень из одной позиции попадает в объект, а не в массив из одного объекта, и принимающий код обязан приводить такое поле к списку сам. Значения читаются по форме записи: цифры дают число, true и false — логическое значение, пустой узел — строку нулевой длины. Отступ результата — два пробела, форматирование отключается параметром, на обработку отводится 120 секунд.

Порядок преобразования XML → JSON

  1. Шаг 1

    Загрузка выгрузки

    За задание принимается несколько файлов. Кодировка берётся из объявления XML в первой строке документа.

  2. Шаг 2

    Форматирование

    Отступы включены по умолчанию: результат удобно читать глазами. Отключите их, если файл уходит в интеграцию, — объём сократится на четверть-треть.

  3. Шаг 3

    Разбор

    Элементы превращаются в объекты, атрибуты получают префикс @, повторяющиеся элементы собираются в массивы, комментарии и DOCTYPE отбрасываются.

  4. Шаг 4

    Проверка формы

    Посмотрите, как легли атрибуты и текстовые узлы, и отдельно — какие элементы стали массивами. Именно здесь чаще всего расходятся ожидания принимающего кода.

Вопросы по работе сервиса

Откуда в именах ключей взялся символ @?

Так помечаются атрибуты. Без префикса их нельзя было бы отличить от дочерних элементов: и то, и другое становится обычным полем объекта. Значение атрибута при этом не меняется, префикс относится только к имени ключа.

Зачем понадобилось поле #text?

Это текстовое содержимое элемента, у которого есть атрибуты или дочерние узлы: положить текст прямо в объект нельзя, там уже находятся другие поля. Если элемент содержит только текст, значение становится строкой напрямую, без дополнительного уровня.

Список из одного элемента стал объектом, а не массивом.

В XML нет разницы между «список из одного» и «одиночный элемент»: массив опознаётся по факту повтора соседних элементов. Разбирающий код должен приводить такое поле к массиву самостоятельно — это ограничение самих форматов, а не конвертации.

Даст ли обратный перевод исходный документ?

Побайтно — нет. Комментарии, DOCTYPE, разделы CDATA и форматирование теряются, а одиночный элемент неотличим от массива из одного. Обратное направление даст корректный, но другой документ. Если файл должен проходить проверку по конкретной схеме XSD, собирайте его по шаблону.

Разворачиваются ли сущности, объявленные в документе?

Нет. Объявление DOCTYPE отбрасывается целиком, вместе с определениями сущностей. Это устраняет два известных класса нагрузки на разборщик: подстановку внешних ресурсов и рекурсивное разрастание. Обычные предопределённые ссылки вроде & обрабатываются штатно.