Как получить XML-выгрузку на Битрикс с вложенными атрибутами?

Каким образом я могу добавить атрибут к тегу и вложить данные, аналогично данному примеру при использовании класса <code>\Bitrix\Main\XmlWriter</code>?
  • 7 апреля 2024 г. 12:19
Ответы на вопрос 2
Для создания XML-выгрузки на Битрикс с вложенными атрибутами вы можете использовать класс \Bitrix\Main\XmlWriter. Вот пример кода, который показывает, как добавить атрибут к тегу и добавить вложенные данные:

```php
use Bitrix\Main\IO\File;
use Bitrix\Main\Text\XmlWriter;

$xmlFile = new File($_SERVER['DOCUMENT_ROOT'] . '/output.xml');
$xmlWriter = new XmlWriter();
$xmlWriter->openFile($xmlFile);

$xmlWriter->startDocument();
$xmlWriter->startElement('root');

// Добавление тега с атрибутом и вложенными данными
$xmlWriter->startElement('tag');
$xmlWriter->writeAttribute('attribute', 'value');
$xmlWriter->writeRaw('Nested data');
$xmlWriter->endElement(); // закрытие тега 'tag'

$xmlWriter->endElement(); // закрытие тега 'root'
$xmlWriter->endDocument();

$xmlWriter->close();
```

Этот код создаст XML-файл с корневым элементом <root>, в котором будет вложен элемент <tag> с атрибутом 'attribute' со значением 'value' и вложенными данными 'Nested data'. После выполнения кода, XML-файл будет сохранен на сервере по указанному пути.
Если <a href="https://gist.github.com/nizom333/0e84e90627e01401f7d7a790b58b6c9d" rel="nofollow">это</a> ( <i>ссылку взял из комментов в документации</i> ) и есть класс <code>\Bitrix\Main\XmlWriter</code> , то с его помощью - никак. <br/> <br/> Он пишет сразу в файл, так что и регуляркой итоговый результат не пройти. <br/> <br/> Можно залезть в него рефлексией, но в программировании это моветон и читабельность кода будет ухудшена. <br/> <br/> Самый оптимальный вариант - наследовать этот класс, изменить несколько его функций и использовать унаследованный класс. Примерно так: <br/> <pre><code class="php">class AppXmlWriter extends XmlWriter
{
    private $file = '';
    private $charset = '';
    private $tab = 0;
    private $f = null;
    private $lowercaseTag = false;
    private $errors = array();

    // конструктор скопирован, т.к. там все private
    public function __construct(array $params)
    {
        if (isset($params['file']))
        {
            $server = \Bitrix\Main\Application::getInstance()-&gt;getContext()-&gt;getServer();
            $this-&gt;file = $server-&gt;getDocumentRoot() . trim($params['file']);
            // create new file
            if (
                isset($params['create_file']) &amp;&amp;
                $params['create_file'] === true &amp;&amp;
                is_writable($this-&gt;file)
                )
            {
                unlink($this-&gt;file);
            }
        }
        if (isset($params['charset']))
        {
            $this-&gt;charset = trim($params['charset']);
        }
        else
        {
            $this-&gt;charset = SITE_CHARSET;
        }
        if (isset($params['lowercase']) &amp;&amp; $params['lowercase'] === true)
        {
            $this-&gt;lowercaseTag = true;
        }
        if (isset($params['tab']))
        {
            $this-&gt;tab = (int)$params['tab'];
        }
    }

    public function prepareAttributes(array $attributes): string
    {
        if (empty($attributes)) {
            return '';
        }

        $result = '';
        foreach ($attributes as $key =&gt; $value) {
            $result .= sprintf(' %s="%s"', $key, $value);
        }

        return $result;
    }

    public function writeBeginTag($code, array $attributes = [])
    {
        if (!$this-&gt;f) {
            return;
        }

        fwrite($this-&gt;f, str_repeat("\t", $this-&gt;tab) . '&lt;' . $this-&gt;prepareTag($code) . $this-&gt;prepareAttributes($attributes) . '&gt;' . PHP_EOL);
        $this-&gt;tab++;
    }

    public function writeFullTag($code, $value, array $attributes = [])
    {
        if (!$this-&gt;f) {
            return;
        }

        $code = $this-&gt;prepareTag($code);
        $codeAttributes = $this-&gt;prepareAttributes($attributes);
        fwrite($this-&gt;f,
            str_repeat("\t", $this-&gt;tab) .
            (
                trim($value) == ''
                ? '&lt;' . $code . $codeAttributes . ' /&gt;' . PHP_EOL
                :   '&lt;' . $code . $codeAttributes . '&gt;' .
                $this-&gt;prepareValue($value) .
                '&lt;/' . $code . '&gt;' . PHP_EOL
            )
        );
    }
}</code></pre>
Похожие вопросы