Парсинг XML-фідів поставщиків для 1С-Bitrix
XML-фід поставщика — це структурований файл з актуальними даними про товари: цінами, остатками, описами, характеристиками. На відміну від Excel-прайса, XML передбачуваний: у нього є схема, і його можна парсити надійно. Але «передбачуваний» не означає «стандартний» — кожен поставщик вигадує свій XML-формат.
Формати XML-фідів
Трапляються кілька поширених структур:
Простий плоский XML:
<products>
<product>
<id>12345</id>
<name>Товар А</name>
<price>1500.00</price>
<stock>10</stock>
</product>
</products>
Ієрархічний із категоріями:
<catalog>
<categories>
<category id="1" name="Електроніка"/>
</categories>
<offers>
<offer id="12345" category_id="1">
<name>Товар А</name>
<param name="Колір">Чорний</param>
</offer>
</offers>
</catalog>
З простором імен:
<feed xmlns:g="http://base.google.com/ns/1.0">
<entry>
<g:id>12345</g:id>
<g:price>1500 RUB</g:price>
</entry>
</feed>
Інструменти парсингу в PHP
SimpleXML — для невеликих файлів (до 50 МБ):
$xml = simplexml_load_file($filePath);
foreach ($xml->offers->offer as $offer) {
$id = (string)$offer['id'];
$price = (float)$offer->price;
}
XMLReader — для великих файлів (сотні тисяч товарів). Читає файл як потік, не завантажує в пам'ять цілком:
$reader = new XMLReader();
$reader->open($filePath);
while ($reader->read()) {
if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'offer') {
$node = new SimpleXMLElement($reader->readOuterXml());
// обробка одного елемента
}
}
При фіді на 500 000 позицій XMLReader — єдиний робочий варіант. SimpleXML при такому розмірі виснажить пам'ять PHP.
XPath — для навігації по складних структурах:
$nodes = $xml->xpath('//catalog/offers/offer[@available="true"]');
Атрибути та вкладені параметри
Багато поставщиків зберігають характеристики товара як список елементів <param>:
<offer id="111">
<param name="Бренд">Samsung</param>
<param name="Гарантія">12 місяців</param>
<param name="Колір">Сріблистий</param>
</offer>
Парсинг таких параметрів:
$params = [];
foreach ($offer->param as $param) {
$name = (string)$param['name'];
$value = (string)$param;
$params[$name] = $value;
}
// $params['Бренд'] === 'Samsung'
Потім маппінг $params['Бренд'] → властивість BRAND в інфоблоці Bitrix.
Маппінг у властивості інфоблоку
Властивості товара в Bitrix зберігаються в таблицях b_iblock_element_property (рядки та числа), b_iblock_element_prop_s{N} (оптимізоване зберігання). Запис через API:
CIBlockElement::SetPropertyValueCode($elementId, 'BRAND', $params['Бренд']);
// або масово при Add/Update:
'PROPERTY_VALUES' => [
'BRAND' => $params['Бренд'],
'WARRANTY' => $params['Гарантія'],
]
Для властивостей-списків (тип LIST) значення повинне бути ID елемента списку. Якщо такого значення немає — додати через CIBlockPropertyEnum::Add().
Синхронізація: оновлення проти повної перезагрузки
Повна перезагрузка — простіше. Деактивувати все, створити/оновити за даними фіду, не знайдене залишається неактивним. Проблема: при великому каталозі (50K+ позицій) — довго та навантажує базу.
Інкрементальна синхронізація — оновлювати лише змінене. Вимагає порівняння з попереднім станом. Підходи:
- Хеш рядка даних: якщо
md5(serialize($currentData)) !== $savedHash— оновити. - Поле
modifiedу фіді: оновлювати лише якщо дата змін новіша.
Розклад та сповіщення
Фід обробляється за розкладом через cron. Типовий розклад для цін та остатків — кожні 2–4 години, для описів та характеристик — раз на день.
0 */3 * * * /usr/bin/php /home/bitrix/www/local/cron/supplier_xml_import.php
Після кожного запуску — запис у журнал: скільки оновлено, скільки помилок, час виконання. При помилці (файл недоступний, неправильний XML) — сповіщення адміністратору.
Графік розробки
| Варіант | Склад | Термін |
|---|---|---|
| Один поставщик, простий XML | Парсер + оновлення цін/остатків | 2–3 дні |
| Складний XML з параметрами | Маппінг характеристик у властивості | 3–5 днів |
| Система для кількох поставщиків | Налаштовувані маппінги, UI | 6–10 днів |







