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

Как работает 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/YML: отфильтровать лишние элементы, переименовать узлы и атрибуты, собрать новую структуру, посчитать значения по правилам и подготовить результат под требования сайта, маркетплейса, PIM или внутренней системы.
Что сделано в примере с ценой
Ниже правила разложены по шагам. Каждый скриншот показывает только строку правила, которая отвечает за текущий шаг.
1. Сначала удаляем пробелы из значения цены. Это полезно, когда поставщик присылает цену как строку вроде 12 990 внутри XML-узла.

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

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

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

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

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

Узел можно заполнить:
- значением из другого места исходного файла. Например, если в XML есть
<name>Тестовый товар</name>,<article>111-111</article>и<brand>ТестовыйБренд</brand>, из них можно собрать новый узел<FullName>Тестовый товар 111-111 ТестовыйБренд</FullName>; - системным значением, например датой запуска или именем источника;
- выражением, например склеить путь категории или посчитать процент скидки;
- можно сделать его переменной.
Переменные: зачем они нужны
Переменная хранит промежуточный результат. Ее удобно использовать, когда одно значение нужно применить в нескольких местах или в нескольких условиях.
Важно: переменные не попадают в итоговую выгрузку. Они служат только для помощи остальным преобразованиям: можно сохранить промежуточный результат и использовать его дальше в правилах, условиях или расчетах.

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