Конвертер XML в JSON для SOAP, API-пейлоадов и атрибутов тегов
Читайте ответы SOAP и XML-пейлоады API как JSON в браузере и записывайте JSON-объекты обратно в теги и атрибуты. Отображение compact предсказуемо, но один дочерний элемент и два одноимённых дают разные структуры JSON, а порядок смешанного текста не сохраняется.
Как работает этот конвертер XML ↔ JSON
Теги становятся ключами, атрибуты уходят в _attributes
Каждый элемент превращается в ключ с именем тега. <user id="7">Ann</user> становится { user: { _attributes: { id: "7" }, _text: "Ann" } }; атрибуты и текст не смешиваются с дочерними тегами.
Один дочерний элемент — объект, два — массив
Один <item> остаётся объектом, два одноимённых <item> становятся массивом JSON. Когда в ответе было две строки, а стала одна, структура меняется, поэтому клиент должен поддерживать обе формы.
У объявления, комментариев и CDATA есть свои ключи
_declaration, _doctype, _comment и _cdata находятся на одном уровне с корневым элементом. CDATA читается как необработанный текст, и все четыре записываются обратно при JSON → XML.
Текст сохраняется, его позиция — нет
В режиме compact текст по обе стороны от дочернего элемента объединяется в массив _text: <r>before<a>1</a>after</r> становится _text: ["before", "after"], а при записи получается beforeafter<a>1</a>. Для чистой обратимости используйте содержимое только из элементов.
Пространства имён и спецсимволы обрабатываются
xmlns / xmlns:p остаются обычными атрибутами, а <, & и > в тексте экранируются при записи и восстанавливаются при чтении. Файлы читаются и преобразуются локально, ничего не загружается.
Вопросы о конвертации XML ↔ JSON
Почему структура JSON меняется, когда приходит одна строка?
Из-за режима compact в xml-js: повторяющиеся одноимённые дочерние элементы становятся массивом, а один остаётся объектом. Два <item> дают item: [...], один — item: {...}. Приводите к массиву перед чтением полей.
Как представляются атрибуты и текст?
Атрибуты попадают в _attributes, текст — в _text, например <user id="7">Ann</user> → { user: { _attributes: { id: "7" }, _text: "Ann" } }. Текст всегда строка, даже в <n>42</n>, а пустой элемент становится {}.
Можно ли преобразовать корневой JSON-массив в XML?
Нет. Корень JSON должен быть одним объектом; массив в корне даёт недопустимые имена тегов вроде <0><r>a</r></0><1><r>b</r></1>. Заверните массив в корневой объект, например { "items": { "item": [...] } }.
Сохраняются ли объявление, комментарии, CDATA и DOCTYPE?
Да, через ключи _declaration, _comment, _cdata и _doctype. При чтении _comment содержит пробелы по краям (например, " hi "); при записи получаются <?xml ...?>, <!--hi-->, <![CDATA[...]]> и <!DOCTYPE r>.
Что происходит с текстом между дочерними элементами?
Режим compact собирает фрагменты текста в массив _text и теряет их позиции. <r>before<a>1</a>after</r> становится { r: { _text: ["before", "after"], a: { _text: "1" } } }, а при записи выходит <r>beforeafter<a>1</a></r>. Режим non-compact сохраняет порядок, но эта страница зафиксирована на compact.
Как обрабатываются пространства имён и спецсимволы?
Объявления пространств имён остаются обычными атрибутами (xmlns, xmlns:p), а теги с префиксом сохраняют префикс в ключе (p:a). Текст экранирует <, & и > при записи и раскрывает сущности при чтении; значения атрибутов экранируют только кавычки, поэтому необработанные < или & внутри атрибута всё ещё могут дать недопустимый XML.
Какие ошибки появляются и загружаются ли данные?
Несколько корней дают «Text data outside of root node», неверный закрывающий тег — «Unmatched closing tag», скалярный корень — «The JSON structure is invalid». Поле становится красным, частичный результат не записывается. Всё выполняется в браузере, файлы никогда не загружаются.

