Конвертировать XML в JSON
Преобразуйте XML в JSON с атрибутами, CDATA и пространствами имен так, как вам удобно, а ошибки синтаксиса указывают точную строку.
Перетащите файлы сюда
.xml, .rss, .svg, .xhtml, .txt · до 300 МБ
Больше настроекМеньше настроек
Как конвертировать
- 1
Перетащите XML-файл
Добавьте один файл или до двадцати. RSS-ленты, SVG-чертежи и XHTML-страницы — это тоже XML, они читаются тем же способом.
- 2
Задайте правила для атрибутов и повторов
Атрибуты можно пометить префиксом, собрать под одним ключом или пропустить. Повторяющиеся теги могут всегда становиться массивами или только когда тег встречается больше одного раза.
- 3
Конвертируйте и скачайте JSON
Нажмите кнопку и сохраните результат с отступами. Пакет файлов возвращается одним ZIP-архивом.
Один элемент или список из одного
Самое неудобное в преобразовании XML в JSON — список с одним элементом. <order> с тремя дочерними <item> очевидно превращается в массив. Но тот же документ с одним item выглядит как обычный объект, и цикл по нему ломается на первых же живых данных. Поэтому правило для массивов — это явная настройка, а не скрытая эвристика. Можно заставить каждый дочерний элемент всегда превращаться в массив.
Числа, которые не должны быть числами
«Умная» типизация превращает 42 в число, а true — в boolean. Обычно это удобно, но иногда оборачивается бедой. Код детали 00123 не должен стать 123, а двадцатизначный налоговый идентификатор не должен округляться и записываться в экспоненциальной форме. Поэтому значения с ведущими нулями и строки цифр длиннее пятнадцати символов остаются строками. А если совсем отключить типизацию, каждое значение сохранится ровно в том виде, как было написано.
Объявления сущностей блокируются
DOCTYPE с объявлением <!ENTITY> отвергается еще до начала разбора. Десять вложенных сущностей, каждая из которых десять раз ссылается на предыдущую, разворачиваются в гигабайты текста и вешают вкладку — классическая атака billion laughs. Здесь не разворачивается ничего, кроме пяти предопределенных сущностей и числовых ссылок на символы, так что атаке нечего разворачивать.
Разбор здесь, а не где-то на сервере
Парсер работает в вашем браузере, в потоке worker, на коде, который пришел вместе со страницей. XML никуда не загружается, поэтому нет серверной копии, которую нужно удалять, нет очереди, и логов тоже нет. Как только вкладка закрывается, исчезают и документ, и полученный из него JSON.
Частые вопросы
Куда попадают XML-атрибуты в JSON?
По умолчанию каждый атрибут становится ключом в том же объекте, где и дочерние элементы, с префиксом @_ — так он не пересекается с тегом-потомком с тем же именем. Можно вместо этого собрать все атрибуты в отдельный под-объект @attributes, чтобы содержимое элемента было чище, или полностью отбросить атрибуты.
Почему один повторяющийся элемент не становится массивом?
Потому что в документе нигде не сказано, что это список. В режиме по умолчанию тег превращается в массив только когда встречается больше одного раза под одним родителем — так структура файла сохраняется буквально. Если потребителю нужен стабильный формат, переключите настройку массивов в «всегда», и даже единственный потомок придет как массив из одного элемента.
Что происходит с секциями CDATA?
По умолчанию содержимое CDATA сливается с текстом элемента, потому что CDATA — это лишь способ экранирования, а не отдельный тип данных. Если важно знать, какая часть значения была записана именно так (например, чтобы потом снова вывести XML), переключите режим на «отдельно», и эти данные окажутся в ключе #cdata.
Можно ли убрать префиксы пространств имен?
Да. Удаление пространств имен превращает dc:title в title, и с такими RSS- и документными форматами гораздо проще работать в коде. Но оставьте префиксы, если два разных пространства имен используют одно и то же локальное имя в одном файле: тогда только префикс не дает ключам слиться.
Почему я получаю ошибку про пользовательские сущности?
Потому что документ с собственными сущностями в DOCTYPE блокируется, а не разворачивается. Это единственная надежная защита от бомб расширения сущностей, которые превращают несколько килобайт в гигабайты памяти. Удалите блок DOCTYPE, и остальной документ будет конвертироваться нормально.
Работают ли RSS-ленты и SVG-файлы?
Да, и те и другие — обычный XML. RSS-лента превращается в объект с метаданными канала и массивом элементов items — с такой структурой удобно работать. SVG-файл превращается в дерево элементов со всеми атрибутами оформления, что удобно для программного анализа и правки рисунков.
Что будет, если в XML синтаксическая ошибка?
Вы увидите строку, столбец и проблемный тег — например «ожидался закрывающий тег в строке 214, столбце 5», а не просто сообщение о неудачном разборе. В файле с десятками тысяч элементов это принципиально: сразу видно, где искать ошибку.
Мой файл куда-то загружается?
Нет. Разбор, проверка и конвертация полностью выполняются локально во вкладке браузера. Сервер не участвует ни на одном этапе, поэтому после закрытия страницы копии вашего документа нигде не остается.