XML в Excel: конвертация выгрузок поставщиков в таблицу

Утро началось с письма: «Прайс во вложении». Во вложении — 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 позициях разгребать это руками — часы.

Excel открыл XML через карту XML: сотня колонок, половина пустых
Результат «как повезёт»: Excel сам решил, какие теги станут колонками

Какие 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 — строка, поля — колонки

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

Экспорт результата в XLSX со значениями
На выходе — XLSX со значениями: дальше обычная работа с прайсом

Программист. Нужен, когда:

  • данные размазаны по узлам, которые ссылаются друг на друга по 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» не бывает, слишком разные структуры у разных файлов.