Скрипт для формирования XML из массива — PROG-TIME

Скрипт для формирования XML из массива

06.06.2022

В PHP часто возникает задача создать XML из массива, например, для формирования фидов товаров, экспорта данных в сторонние системы или интеграции с CRM. Простого implode или json_encode для XML недостаточно — нужен правильный формат с поддержкой вложенных элементов, атрибутов и корректной кодировкой.

В этой статье мы разберём рекурсивную функцию array_to_xml, которая решает эту задачу гибко и надёжно.

Назначение функции

Функция array_to_xml позволяет:

  • Преобразовывать любой многомерный массив PHP в XML.
  • Поддерживать вложенные элементы и иерархию тегов.
  • Добавлять атрибуты элементов через специальный ключ _attributes.
  • Задавать значение элемента через ключ _value.
  • Генерировать корректные теги для числовых и строковых ключей.
<?php
function array_to_xml($arrayPHP, &$xmlObj)
{
    foreach ($arrayPHP as $key => $value) {

        /* массив системных ключей */
        $systemKeys = [
            "_attributes",
            "_value"
        ];

        /* если значение — массив и не системный ключ */
        if (is_array($value) && !in_array($key, $systemKeys)) {

            /* создаём ключ для xml элемента */
            if (strpos($key, "_elem") !== false) {
                $arrKeys = explode(":", $key);
                $codeTag = is_int($arrKeys[1]) ? "item" . $arrKeys[1] : $arrKeys[1];
            } else {
                $codeTag = is_int($key) ? "item" . $key : $key;
            }

            /* создаём элемент */
            if (isset($value["_value"])) {
                $subnode = $xmlObj->addChild($codeTag, $value["_value"]);
            } else {
                $subnode = $xmlObj->addChild($codeTag);
            }

            /* добавляем атрибуты для элемента */
            if (isset($value["_attributes"])) {
                foreach ($value["_attributes"] as $attrKey => $attrVal) {
                    $subnode->addAttribute($attrKey, $attrVal);
                }
            }

            /* рекурсивно обрабатываем вложенные элементы */
            array_to_xml($value, $subnode);

        } elseif (!in_array($key, $systemKeys)) {

            /* создаём ключ для xml элемента */
            if (strpos($key, "_elem") !== false) {
                $arrKeys = explode(":", $key);
                $codeTag = is_int($arrKeys[1]) ? "item" . $arrKeys[1] : $arrKeys[1];
            } else {
                $codeTag = is_int($key) ? "item" . $key : $key;
            }

            $xmlObj->addChild($codeTag, htmlspecialchars($value));
        }
    }
}

/* создаём объект для XML */
$xml_user_info = new SimpleXMLElement('<?xml version="1.0"?><shop></shop>');

/* конвертируем PHP массив в XML код */
array_to_xml($users_array, $xml_user_info);

/* сохраняем результат в файл */
$xml_file = $xml_user_info->asXML('users.xml');

if ($xml_file) {
    echo 'XML файл был успешно создан';
} else {
    echo 'XML файл был создан с ОШИБКОЙ';
}

Как работает функция

Функция рекурсивно проходит массив:

  1. Проверяет ключ на служебные элементы (_attributes и _value).
  2. Генерирует корректный тег для XML:
    • если ключ числовой — добавляет префикс item.
    • если ключ содержит _elem: — извлекает имя тега из строки.
  3. Создаёт элемент XML через SimpleXMLElement->addChild().
  4. Добавляет атрибуты, если они есть.
  5. Рекурсивно обрабатывает вложенные элементы.
  6. Обрабатывает обычные текстовые значения с htmlspecialchars() для корректной кодировки XML.

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

$xml_user_info = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><shop></shop>');
array_to_xml($users_array, $xml_user_info);
$xml_user_info->asXML('users.xml');

После выполнения скрипта будет создан файл users.xml с таким содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<shop>
<item0 id="1">
<name>Иван</name>
<email>ivan@example.com</email>
</item0>
<item1 id="2">
<name>Мария</name>
<email>maria@example.com</email>
</item1>
</shop>

Преимущества функции

  • Подходит для любых массивов PHP, включая сложные вложенные структуры.
  • Позволяет добавлять атрибуты к любому элементу.
  • Автоматически корректирует числовые ключи, чтобы XML был валидным.
  • Проста в использовании и легко расширяется под любые задачи.

Рекомендации по использованию

  1. Всегда используйте UTF-8 при создании корневого XML.
  2. Для текстовых значений используйте htmlspecialchars(), чтобы избежать ошибок с символами <, > и &.
  3. Если массив очень большой — можно добавить отключение форматирования или сохранение по частям для экономии памяти.
  4. Функцию можно использовать для генерации XML-фидов, экспорта данных из CMS, интеграций с API и других задач.

Итог

Функция array_to_xml — это универсальный инструмент для конвертации массива PHP в XML с поддержкой атрибутов, вложенных элементов и корректной кодировки. Она позволяет создавать структурированные и валидные XML-файлы для любых целей: от экспорта товаров до интеграции с внешними системами.