SS Тулбокс
SS Тулбокс
Все данные обрабатываются локально

Конвертер XML в JSON для SOAP, API-пейлоадов и атрибутов тегов

Читайте ответы SOAP и XML-пейлоады API как JSON в браузере и записывайте JSON-объекты обратно в теги и атрибуты. Отображение compact предсказуемо, но один дочерний элемент и два одноимённых дают разные структуры JSON, а порядок смешанного текста не сохраняется.

Как работает этот конвертер XML ↔ JSON

  1. Теги становятся ключами, атрибуты уходят в _attributes

    Каждый элемент превращается в ключ с именем тега. <user id="7">Ann</user> становится { user: { _attributes: { id: "7" }, _text: "Ann" } }; атрибуты и текст не смешиваются с дочерними тегами.

  2. Один дочерний элемент — объект, два — массив

    Один <item> остаётся объектом, два одноимённых <item> становятся массивом JSON. Когда в ответе было две строки, а стала одна, структура меняется, поэтому клиент должен поддерживать обе формы.

  3. У объявления, комментариев и CDATA есть свои ключи

    _declaration, _doctype, _comment и _cdata находятся на одном уровне с корневым элементом. CDATA читается как необработанный текст, и все четыре записываются обратно при JSON → XML.

  4. Текст сохраняется, его позиция — нет

    В режиме compact текст по обе стороны от дочернего элемента объединяется в массив _text: <r>before<a>1</a>after</r> становится _text: ["before", "after"], а при записи получается beforeafter<a>1</a>. Для чистой обратимости используйте содержимое только из элементов.

  5. Пространства имён и спецсимволы обрабатываются

    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». Поле становится красным, частичный результат не записывается. Всё выполняется в браузере, файлы никогда не загружаются.

Связанные инструменты
SponsorMindElixir