Утро началось с письма: «Прайс во вложении». Во вложении — offers.xml на полтора мегабайта. Двойной клик, Excel спросил что-то про «карту XML» и показал одну колонку с обрывками текста. Файл исправен, поставщик не вредничал: XML просто устроен иначе, чем таблица. Разберёмся, что внутри такого файла, почему Excel читает его как попало и как всё-таки получить нормальный прайс.
Что такое XML по-простому
XML — текстовый файл, где каждый кусок данных обёрнут в теги: <offer>Кеды синие</offer>. Внешне похоже на HTML, но имена тегов не зафиксированы — их придумывает тот, кто делал выгрузку. У одного поставщика товар называется <offer>, у другого — <Товар>, у третьего — <item>.
Главное отличие от таблицы — вложенность. Данные в XML лежат деревом: каталог содержит категории, категория — товары, внутри товара — цена, остаток и характеристики. Плюс у тегов бывают атрибуты: <currency code="RUB"/>.
Таблица плоская: строки и колонки, две координаты. XML — дерево произвольной глубины. Вся конвертация XML в Excel — это сплющивание дерева в плоскость, и именно на нём всё ломается.
Почему Excel открывает XML «как повезёт»
Читать XML Excel умеет, но ему нужна «карта XML» — правило, какие теги станут колонками, а какие строками. При открытии файла Excel предлагает три варианта: «как XML-таблицу», «как книгу только для чтения» и «панель источника XML». Первый вариант строит карту автоматически: повторяющийся тег вроде <offer> становится строками, вложенные в него теги — колонками.
На плоской выгрузке это почти работает. На реальной — нет, потому что XML расширяем: у разных товаров разный набор тегов. У одного есть <weight> и <dimensions>, у другого нет. Excel строит колонки по самому «толстому» товару, и у половины строк ячейки остаются пустыми. Глубокая вложенность либо превращается в колонки с именами через слэш, либо теряется совсем.
Итог непредсказуем: одна колонка с кусками текста, сотня колонок с пустотами или таблица, где цены лежат отдельно от названий. При 500 позициях разгребать это руками — часы.

Какие XML приезжают к продавцу
- CommerceML (CML) — стандарт обмена 1С с сайтами и между конфигурациями. Файлы import.xml (каталог) и offers.xml (цены и остатки): это язык машин, а не прайс для человека.
- YML-фиды — частный случай XML с фиксированными тегами (
yml_catalog,shop,offers). Так поставщики отдают каталог «под Яндекс Маркет». У этого сюжета есть отдельный разбор — про YML в Excel. - Отчёты и выгрузки систем: банковские выписки, отчёты маркетплейсов и рекламных кабинетов, экспорт складских программ — у каждой свои теги.
Общее у них одно: внутри есть повторяющийся узел-«запись» (товар, операция, строка отчёта) и вложенные в него поля. Найдёте этот узел — половина задачи решена.
Как получить плоскую таблицу
Попросить другой формат. Самый недооценённый вариант. Та же 1С штатно выгружает прайс в Excel или CSV, а многие API по одному параметру отдают JSON вместо XML. Пять минут переписки экономят час разбора. Что выбрать из табличных форматов — в статье CSV против XLSX.
Конвертер. Если выгрузка — это YML-фид или JSON, её можно загрузить в конвертер сразу: он понимает древовидные файлы. Механика такая: повторяющийся узел (offer, товар, запись) становится строкой, вложенные поля превращаются в колонки вроде offer.price, атрибуты достаются тоже.

Дальше обычный пайплайн: на шаге «Колонки» переименовываете offer.price в «Цена», удаляете технические поля, на «Фильтрах» отсекаете позиции без остатка — и скачиваете XLSX со значениями. Как это работает на JSON, разобрано в отдельной статье.

Программист. Нужен, когда:
- данные размазаны по узлам, которые ссылаются друг на друга по id: категории лежат отдельно, товары на них ссылаются — это уже сборка, а не конвертация;
- XML нестандартный: смешанный текст, блоки CDATA, пространства имён в духе CommerceML;
- выгрузку надо забирать регулярно: скрипт сам скачает XML и положит рядом готовый XLSX.
Частые вопросы
Чем XML отличается от YML?
YML — частный диалект XML с заранее зафиксированными тегами: yml_catalog, shop, offers. Его придумали для фидов Яндекс Маркета, поэтому любой YML устроен одинаково. «Просто XML» может быть чем угодно: теги и структуру определяет автор выгрузки, и у двух поставщиков они совпадут только случайно.
Excel предлагает «открыть как XML-таблицу» — соглашаться?
Для разового просмотра — да: Excel сам построит карту и покажет таблицу. На простой выгрузке результат приличный, на вложенной ждите пустых колонок и потерянных полей. Если файл дальше пойдёт в загрузку на площадку, такую таблицу всё равно придётся чистить.
Поставщик прислал import.xml и offers.xml из 1С — что с ними делать?
Это CommerceML, обменный формат между 1С и сайтом, а не прайс для менеджера. Попросите выгрузить тот же прайс из 1С в Excel или CSV — это штатная возможность конфигурации. Если поставщик умеет отдать YML или JSON — загрузите файл в конвертер и получите таблицу.
Конвертер принимает .xml напрямую?
Основные форматы на входе — XLS, XLSX и CSV; на лендинге для JSON принимаются ещё и YML-фиды. Произвольный XML сначала перегоняют в один из этих форматов или разбирают скриптом: универсального «угадать любой XML» не бывает, слишком разные структуры у разных файлов.