Создание выгрузки Битрикс XML через XmlWriter
Как сформировать XML-выгрузку в Битрикс через класс XmlWriter (D7 API): структура кода, пример с товарами и советы по производительности.
Введение
Выгрузка будет реализована на основе Bitrix API класс XmlWriter.
Описание класса
В функции getData() получаете необходимые вам данные, которые нужны в конечном XML (пример: Элементы инфоблока)
Формируете данные в нужном вам формате с учетом вложенности массива
В цикле (функция index) происходит добавление данные в конечный файл с учетом вложенности массива
Получаете готовый xml файл по *пути, указанному в параметре конструктора с ключом file
Путь к файлу указывается относительно корня сайта
Исходных код
<?php
/**
* Генерация XML файла
* @author https://t.me/bitrix_web<br> * @author https://code-culture.ru/
*/
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
class GenerateXml{
private $xml, $data;
public function index(){
self::getData();
$this->xml = new \Bitrix\Main\XmlWriter(['create_file' => true, 'charset' => 'UTF-8', 'file' => '/xml-data.xml']);
$this->xml->openFile();
$this->xml->writeBeginTag('shop');
$this->xml->writeBeginTag('items');
foreach ($this->data as $item) {
$this->xml->writeItem($item, 'item');
}
$this->xml->writeBeginTag('items');
$this->xml->writeEndTag('shop');
$this->xml->closeFile();
}
private function getData(){
$this->data = [
0 => [
'id' => 512,
'name' => 'Футболка',
'price' => 145,
'code' => 'tshirt'
],
1 => [
'id' => 513,
'name' => 'Футболка Синяя',
'price' => 135,
'code' => 'red-tshirt1'
],
2 => [
'id' => 514,
'name' => 'Футболка Красная',
'price' => 125,
'code' => 'red-tshirt2'
]
];
}
}
$xml = new GenerateXml();
$xml->index();
Комментарии (2)
спасибо за пример с writeItem, не знала что можно вложенность массива так просто скормить. только в коде опечатка - в index() два раза writeBeginTag('items'), второй явно должен быть writeEndTag, иначе тег не закроется и парсер ругнётся
а как быть если инфоблок на 50к товаров? XmlWriter же вроде именно для потоковой записи и придуман, чтобы не собирать весь массив в память разом, а тут в getData() всё равно сначала весь массив грузим через GetList, никакой экономии памяти по факту нет