Использование класса \Bitrix\Main\XmlWriter для экспорта данных в XML

В этой статье мы рассмотрим класс \Bitrix\Main\XmlWriter из фреймворка 1С-Битрикс, который упрощает экспорт данных в формате XML. Класс предоставляет удобные методы для открытия файла, записи в него контента с учетом вложенных структур и закрытия файла. Также мы разберём сценарии пошагового экспорта больших объёмов данных из базы.

Использование класса \Bitrix\Main\XmlWriter для экспорта данных в XML

Содержание

  1. Общее описание
  2. Пример подключения и создания объекта
  3. Методы класса XmlWriter
  4. Простой пример экспорта
  5. Пошаговый экспорт больших объёмов (итерационный)
  6. Заключение

1. Общее описание

Класс XmlWriter является частью модуля main и располагается по пути:

bitrix/modules/main/lib/xmlwriter.php

Он предназначен для удобной записи структурированных данных в формате XML с возможностью:

  • Гибкой настройки кодировки.
  • Автоматического создания или дописывания в существующий файл.
  • Пошаговой записи больших объёмов данных (например, при экспорте из базы).
  • Удобного управления вложенными структурами.

Все вызовы методов производятся последовательно, что позволяет легко контролировать процесс формирования XML-файла.

2. Пример подключения и создания объекта

Перед началом работы нужно убедиться, что в вашем скрипте или классе подключается пространство имён:

use Bitrix\Main\XmlWriter;

Далее можно создать объект, передав ему массив параметров:

// Создание экземпляра XmlWriter
$export = new \Bitrix\Main\XmlWriter([
    'file'        => '/upload/export/data.xml', // путь к файлу относительно корня сайта
    'create_file' => true,                      // если true, то при создании заново удалит старый файл
    'charset'     => SITE_CHARSET,              // кодировка файла, по умолчанию — кодировка сайта
    'lowercase'   => true,                      // приводить ли все теги к нижнему регистру
    'tab'         => 0                          // с какой табуляции начать запись
]);

Обратите внимание:

  • Параметр file должен содержать путь к файлу относительно корня сайта.
  • Если указан create_file => true, и предыдущий файл существует и доступен для записи, то он будет перезаписан.
  • lowercase при true автоматически приводит все имена тегов к нижнему регистру.
  • Параметр tab можно использовать, если собираетесь дописывать файл не с начала, а уже к существующей структуре.

3. Методы класса XmlWriter

Ниже перечислены основные методы, которые нужно знать, чтобы полноценно работать с классом.

3.1. __construct(array $params)

Описание: Метод-конструктор, вызывается при создании экземпляра класса. Именно здесь инициализируются все настройки.

Основные параметры ($params):

  • file (string) — путь к файлу, в который будет производиться запись.
  • create_file (bool) — при true удалит старый файл и создаст новый (если он уже существовал и был доступен для записи).
  • charset (string) — кодировка, по умолчанию берётся константа SITE_CHARSET.
  • lowercase (bool) — если true, теги приводятся к нижнему регистру.
  • tab (int) — уровень табуляции, с которого начинать запись. Например, полезно при дописывании.

Пример использования:

$export = new \Bitrix\Main\XmlWriter([
    'file'        => '/upload/export/data.xml',
    'create_file' => true,
    'charset'     => 'UTF-8',
    'lowercase'   => false,
    'tab'         => 0
]);

3.2. writeItem(array $item, string $wrapperTag = '')

Описание: Записывает один элемент (массив) в XML-файл. Если указать $wrapperTag, то элемент будет «обрамлён» соответствующим тегом. При обнаружении в значении массива вложенного массива метод рекурсивно вызовет сам себя для записи вложенных структур.

Пример использования:

$data = [
    'name'   => 'Example',
    'fields' => [
        'field1' => 'value1',
        'field2' => 'value2'
    ]
];

// Обрамляем в тег <item>
$export->writeItem($data, 'item');

// Альтернативно: можно не указывать второй параметр, тогда просто записывает структуру, но без вложенного тега
$export->writeItem($data);

Результат в файле:

<item>
    <name>Example</name>
    <fields>
        <field1>value1</field1>
        <field2>value2</field2>
    </fields>
</item>

3.3. writeFullTag(string $code, string $value)

Описание: Записывает в XML-файл один полный тег вида <code>value</code>. Если value пустая строка, тогда будет создан самозакрывающийся тег <code />.

Пример использования:

$export->writeFullTag('title', 'Тестовая запись');
$export->writeFullTag('emptyTag', '');  // выведет <emptyTag />

3.4. writeEndTag(string $code)

Описание: Записывает конечный (закрывающий) тег.

Например, если мы раньше писали writeBeginTag('items'), в конце нужно корректно закрыть этот тег:

$export->writeEndTag('items');

3.5. writeBeginTag(string $code)

Описание: Записывает начальный (открывающий) тег.

Пример использования:

$export->writeBeginTag('products');

Это выведет:

<products>

Чтобы закрыть </products>, необходимо вызвать writeEndTag('products').

3.6. openFile()

Описание: Открывает файл для записи и начинает XML-запись. Если файл не существует, он будет создан. Если файл уже есть, то может быть дописан (при условии, что он доступен для записи).

Важно! Если используется create_file => true в конструкторе и старый файл доступен для записи, он будет удалён перед созданием нового.

Пример использования:

$export->openFile();

После вызова openFile() в начале файла автоматически добавляется служебная строка:

<?xml version="1.0" encoding="UTF-8"?>

3.7. closeFile()

Описание: Закрывает открытый файл. Вызывать обязательно после окончания записи, чтобы корректно завершить работу с ресурсом файла.

Пример использования:

$export->closeFile();

3.8. getErrors()

Описание: Возвращает массив ошибок, накопленных за время работы с классом.

Пример использования:

$errors = $export->getErrors();
if (!empty($errors)) {
    foreach ($errors as $error) {
        // $error->getMessage(), $error->getCode()
        echo "Ошибка: " . $error->getMessage() . " (код " . $error->getCode() . ")";
    }
}

4. Простой пример экспорта

Ниже приведён пример кода, в котором создаётся объект класса XmlWriter, открывается файл для записи, формируется структура и записывается в файл, а затем файл закрывается.

use Bitrix\Main\XmlWriter;

$export = new XmlWriter([
    'file'        => '/upload/export/items.xml',
    'create_file' => true,
    'charset'     => SITE_CHARSET,
    'lowercase'   => true
]);

// Открываем файл
$export->openFile();

// Начинаем запись блока items
$export->writeBeginTag('items');

// Пример массива для записи
$test = [
    'name'  => 'Tra & tata',
    'time'  => time(),
    'array' => [
        'one' => 1,
        'two' => 2,
        'subarray' => [
            't1' => 1,
            't2' => 2
        ]
    ]
];

// Записываем элемент test в обёртку <item>
$export->writeItem($test, 'item');

// Вторым параметром мы передаём обрамляющий тег для массива
$export->writeItem(['item' => $test]);

// Закрываем тег items
$export->writeEndTag('items');

// Проверяем, были ли ошибки
$errors = $export->getErrors();
if (!empty($errors)) {
    foreach ($errors as $error) {
        // Обрабатываем ошибки
    }
}

// Закрываем файл
$export->closeFile();

Данный код в результате сформирует файл items.xml со структурой:

<?xml version="1.0" encoding="UTF-8"?>
<items>
    <item>
        <name>Tra & tata</name>
        <time>1679912345</time>
        <array>
            <one>1</one>
            <two>2</two>
            <subarray>
                <t1>1</t1>
                <t2>2</t2>
            </subarray>
        </array>
    </item>
    <item>
        <item>
            <name>Tra & tata</name>
            <time>1679912345</time>
            <array>
                <one>1</one>
                <two>2</two>
                <subarray>
                    <t1>1</t1>
                    <t2>2</t2>
                </subarray>
            </array>
        </item>
    </item>
</items>

Обратите внимание, что во втором случае (при вызове $export->writeItem(['item' => $test]);) мы получаем дополнительный внутренний уровень <item><name>...</name></item>.

5. Пошаговый экспорт больших объёмов (итерационный)

Основное преимущество класса XmlWriter – возможность пошаговой записи (например, по шагам мастера экспорта, если нужно выгружать большое количество данных и не хочется формировать весь массив данных сразу в памяти).

Пример кода, где мы не создаём файл заново на каждом шаге, а дописываем в существующий:

use Bitrix\Main\XmlWriter;

// Предположим, у нас есть переменная $step, которая указывает,
// на каком шаге экспорта мы сейчас находимся.
$export = new XmlWriter([
    'file'        => '/upload/export/items.xml',
    'create_file' => ($step == 0), // Файл создаётся только на первом шаге
    'charset'     => SITE_CHARSET,
    'lowercase'   => true
]);

$export->openFile();

// На самом первом шаге (step = 0) открываем общий тег <items>
if ($step == 0) {
    $export->writeBeginTag('items');
}

// Условно, на каждом шаге у нас есть выборка $test, которую нужно дописать в XML
$test = [
    'name'  => 'Sample ' . $step,
    'time'  => time(),
    'array' => [
        'one' => 1,
        'two' => 2
    ]
];

// Пишем очередной элемент
$export->writeItem($test, 'item');

// На самом последнем шаге (например, step = $maxSteps - 1) закрываем общий тег
if ($step == $maxSteps - 1) {
    $export->writeEndTag('items');
}

// Закрываем файл
$export->closeFile();

Суть такого подхода:

  • При первом шаге мы создаём (или пересоздаём) файл (параметр create_file => true).
  • Записываем заголовок (<?xml version="1.0" encoding="..."?>), открываем корневой тег (например, <items>).
  • На каждом промежуточном шаге не создаём файл заново и не закрываем <items>. Просто дописываем нужные данные (при этом параметр create_file уже false).
  • На последнем шаге в конце дописываем закрывающий тег </items>.
  • Закрываем файл closeFile(), чтобы завершить запись и освободить ресурс.

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

6. Заключение

Класс \Bitrix\Main\XmlWriter – удобный инструмент для экспорта больших структурированных данных в XML. Его главное преимущество – гибкость и возможность пошаговой записи, что очень актуально для проектов на 1С-Битрикс, где нужно формировать файлы выгрузки (например, для обмена с внешними системами, маркетплейсами и т.д.).

Основные рекомендации:

  1. Продумайте кодировку и корректно укажите charset, если используете отличную от кодировки сайта.
  2. Если файл уже существует и дописывается, устанавливайте create_file => false, чтобы не перезаписывать его.
  3. Используйте getErrors() для контроля возможных проблем с доступом к файлу (например, если нет прав на запись).
  4. При больших объёмах данных разбивайте экспорт на шаги, используя механизмы шагов ($step), и открывайте/закрывайте теги в нужный момент.

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

Теги:  XmlWriter, экспорт данных, XML, PHP

Предупреждение / Disclaimer

Похожие статьи

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора