Класс XmlWriter для экспорта данных в XML файл в 1С-Битрикс
С версии 17.0.0 в системе появился новый класс для создания файлов XML и экспорта данных с сайта — XmlWriter.
Данный класс содержит минимальный набор функций, достаточный для формирования стандартной структуры файлов XML, а также несколько ключевых параметров, таких как: создавать новый файл или обновлять текущий, установить кодировку, создавать теги строго в нижнем регистре, формировать дополнительные отступы при обновлении файла. Интересно будет следить за направлением расширения его функционала, поскольку считаю, что развивать и совершенствовать в нём есть что. Приятным бонусом есть формат передачи параметра create_file, который позволяет адаптировать класс для пошаговой записи в файл при больших объёмах данных, что является довольно частой задачей, стоит отметить.
Среди несомненных плюсов класса XmlWriter — возможность быстро структурировать стандартный файл и записать в него информацию. При этом используя стандартный битриксовый массив данных и всего один метод для всех составляющих данных элемента: writeItem(array $item, $wrapperTag = '')
.
Пример использования данной функции есть в официальной документации на сайте Битрикс, поэтому, считаю, нет необходимости подробно останавливаться на ней. Отмечу лишь, что данный метод состоит из других дополнительных, которые можно также использовать отдельно в случае, если структура файла должна соответствовать определенному формату и отличается от битриксовой.
На практике всегда есть задачи, которые раскрывают все плюсы и минусы стандартного функционала системы, с которой работаешь. В одном из таких случаев мне посчастливилось столкнуться с особенностями применения стандартных методов описываемого класса. Здесь стоит рассмотреть подробнее.
Итак, первым моментом, который требовалось реализовать, была необходимость создать корневой элемент с атрибутами. Это легко можно сделать путем передачи названия тега (создаваемого элемента) вместе с его атрибутами в метод writeBeginTag, например:
writeBeginTag('Ads formatVersion="3" target="sitename.ru"');
Полный код с содержанием вышеприведенного метода выглядит следующим образом:
Следующая задача — создать элемент с вложенными динамическими подэлементами с атрибутами, вида:
Здесь можно использовать следующий цикл:
$export->writeBeginTag('Images');
foreach($exportItem['Images'] as $image)
$export->writeFullTag('Image url="'.$siteUri.$image.'"', '');
$export->writeEndTag('Images');
где:
$siteUri — домен сайта вместе с протоколом http или https,
$image — относительный путь к изображению.
Обратите внимание, что в метод мы передаём пустое значение тега вторым параметром. Это необходимо для того, чтобы наш элемент не имел вложенного содержимого, как
Эта особенность метода не описана в документации, но видна по исходному коду файла класса. В нём есть проверка на наличие пустого значения:
Здесь же замечаем ещё одну особенность метода writeFullTag. Если в значение $value передать спецсимволы '<', '>', '"', '\'', '&', то они будут преобразованы в соответствующие коды спецсимволов, например:
В целом, здорово, что в метод заложена фильтрация и очистка данных, которая важна для поддержания целостности файла. Но данные функции оказались неудобными в случае необходимости дополнительного форматирования текста. В моём случае требовалось в элемент Description передать длинный текст с форматированием через символьные данные
Здесь решено было использовать нестандартный подход к использованию стандартных методов класса. После использования набора методов
- первый пункт
Результат стал читаемым для парсера файла, но, к сожалению, перфекционизм структуры немного пострадал. Перед закрывающим тегом
Возможно, есть более элегантное решение для последнего описанного случая, но в данной статье, думаю, можно остановиться на описанном рабочем решении, продолжая с интересом исследовать и наблюдать за развитием класса XmlWriter. Поскольку, на мой взгляд, он удобен в работе и имеет все шансы стать популярным штатным инструментом для разработчиков 1С-Битрикс.
Елена Подранецкая