XML/YML от поставщика: загрузка, снапшот и преобразования

Как Eofferix принимает XML/YML-файлы и ответы, строит снапшот элементов и атрибутов и преобразует данные в JSON, таблицы, другой XML/YML или импорт.

Eofferix принимает XML/YML-файлы и XML/YML-ответы. Данные можно загрузить как разовый файл, получать автоматически из вложения к email, забирать по прямой ссылке, по ссылке с авторизацией, через FTP/FTPS/SFTP или из API поставщика.

После загрузки исходного файла сервис создает XML-снапшот, по которому настраивается структура результата. Затем XML/YML можно преобразовать в JSON, таблицы CSV/XLSX, другой XML/YML с измененными элементами, атрибутами и значениями или импортировать в приложения, которые поддерживает сервис.

XML-снапшот поставщика в Eofferix
XML-снапшот показывает уникальные элементы, атрибуты и примеры значений из файла поставщика.

Как работает XML-снапшот

После загрузки исходного файла Eofferix анализирует его и превращает в короткий снапшот с уникальными элементами, атрибутами и примерами значений. Если в документе тысяча товаров, в снапшоте будет показан один типовой повторяющийся элемент, а не тысяча одинаковых веток.

В снапшоте можно задать новые названия элементам и атрибутам, изменить структуру, убрать лишние ветки, создать новые узлы и настроить правила преобразования. Для YML логика такая же: сервис разбирает каталог, категории, предложения, цены, остатки и параметры как XML-структуру.

Что можно преобразовать

  • Переименование элементов и атрибутов. В самом XML атрибут пишется без @: <offer id="A-100">. В путях и списках Eofferix он отображается как @id; его можно переименовать так, чтобы получить <product external_id="A-100">, а <name> превратить в <title>.
  • Фильтрация записей. Оставить только предложения с @available = true, товары с остатком больше нуля или элементы нужной категории.
  • Изменение вложенности. Перенести цену из атрибута в отдельный элемент, собрать <param> в характеристики, а изображения разложить в нужный контейнер.
  • Расчет значений. Посчитать цену с наценкой, скидку в процентах, путь категории, дату импорта или значение на основе соседнего XML-узла.
  • Преобразовать изображения. Конвертировать в формат jpg/png/webp, изменить размер изображений, наложить водяной знак.
  • Импорт в приложение. Привязать XML-элементы и атрибуты к полям каталога, CMS, CRM, маркетплейса или другого поддерживаемого направления.
Настройки XML-значения Цена с правилами преобразования
Пример последовательных преобразований для XML-значения Цена. Правила могут учитывать текущее значение, соседние узлы и атрибуты документа.

Примеры преобразований

Инструмент преобразований позволяет сильно изменить итоговый XML/YML: отфильтровать лишние элементы, переименовать узлы и атрибуты, собрать новую структуру, посчитать значения по правилам и подготовить результат под требования сайта, маркетплейса, PIM или внутренней системы.

Что сделано в примере с ценой

Ниже правила разложены по шагам. Каждый скриншот показывает только строку правила, которая отвечает за текущий шаг.

1. Сначала удаляем пробелы из значения цены. Это полезно, когда поставщик присылает цену как строку вроде 12 990 внутри XML-узла.

Удалить пробелы из XML-значения цены

2. Если цена не пустая, сервис увеличивает ее на 15%. Так можно добавить наценку, не меняя исходный XML.

Шаг 2: расчет наценки для XML-значения цены

3. Дальше правило смотрит на другой узел документа: /catalog/items/stock/qty. Если остаток меньше 5, цена заменяется на 0.

Шаг 3: остаток меньше 5 - заменить цену на 0

4. Еще одно правило использует узел /catalog/items/brand: для бренда TestBrand цена дополнительно умножается на 1,5.

Шаг 4: бренд TestBrand - умножить цену на 1,5

5. В конце результат округляется до одного знака по стандартным правилам.

Шаг 5: округление результата

Простой пример: переименовать элементы и оставить активные товары

В этом примере берем повторяющиеся элементы catalog.items.item, оставляем только активные товары и приводим названия элементов к формату целевой выгрузки.

Было
исходный XML
<catalog>
  <items>
    <item id="A-100" active="true">
      <name>Кресло Nordic</name>
      <brand>Nordic Home</brand>
      <prices>
        <base currency="USD">129.90</base>
        <discount currency="USD">119.90</discount>
      </prices>
    </item>
  </items>
</catalog>
Стало
после настройки
<catalog>
  <products>
    <product external_id="A-100">
      <title>Кресло Nordic</title>
      <brand>Nordic Home</brand>
      <price currency="USD">119.90</price>
      <old_price currency="USD">129.90</old_price>
    </product>
  </products>
</catalog>

Правила:

  1. В исходном XML есть товар с id = A-100. Остальные товары идут по такой же структуре, но снапшот показывает один представитель повторяющейся ветки catalog.items.item. Кликните значение true у атрибута active и в блоке Условия выгрузки выберите Условие для элемента целиком. Так можно выгружать только элементы со значением true или, наоборот, не выгружать элементы со значением false.
    Условия выгрузки для активного XML-элемента
    Условие применено к элементу целиком: товар попадает в выгрузку, если active равно true; второе правило можно использовать как обратную проверку для false.
  2. Переименуйте атрибут id в external_id: кликните по названию атрибута или узла и введите новое название.
    Переименование XML-атрибута id в external_id
    Настройки узла: новое имя external_id вводится в поле Название узла.
  3. По тому же принципу переименуйте элемент name в title.
  4. С ценами есть два рабочих сценария. Если контейнер prices подходит, достаточно переименовать discount в price, а base в old_price. Если price и old_price должны лежать на уровне товара, создайте новые узлы рядом с title и заполните их значениями из /catalog/items/item/prices/discount и /catalog/items/item/prices/base. Также узлу можно изменить структуру: наведите курсор на название узла и в появившемся меню нажмите стрелку влево, чтобы поднять узел на уровень остальных узлов элемента.

Новые узлы

Новый XML-узел нужен, когда в результате должно появиться поле, которого нет в исходном XML/YML, или когда исходные данные нужно разложить иначе.

Добавление нового узла final_price в XML-снапшоте

Узел можно заполнить:

  1. значением из другого места исходного файла. Например, если в XML есть <name>Тестовый товар</name>, <article>111-111</article> и <brand>ТестовыйБренд</brand>, из них можно собрать новый узел <FullName>Тестовый товар 111-111 ТестовыйБренд</FullName>;
  2. системным значением, например датой запуска или именем источника;
  3. выражением, например склеить путь категории или посчитать процент скидки;
  4. можно сделать его переменной.

Переменные: зачем они нужны

Переменная хранит промежуточный результат. Ее удобно использовать, когда одно значение нужно применить в нескольких местах или в нескольких условиях.

Важно: переменные не попадают в итоговую выгрузку. Они служат только для помощи остальным преобразованиям: можно сохранить промежуточный результат и использовать его дальше в правилах, условиях или расчетах.

Настройка XML-узла final_price как переменной
Узел можно сделать переменной: она вычисляется раньше остальных полей и затем используется в правилах и условиях.

Например, переменная final_price рассчитывается один раз:

  • final_price записывается в <price>;
  • <old_price> заполняется базовой ценой, если final_price меньше базовой цены;
  • условие выгрузки проверяет, что final_price больше нуля;
  • другое правило использует final_price для расчета скидки.

Так правила остаются короче, а цена в разных частях результата не расходится из-за повторного ручного расчета.