W3docs

asXML()

Как PHP-метод SimpleXMLElement::asXML() возвращает XML в виде строки или записывает его в файл: примеры и типичные ошибки.

Введение

SimpleXMLElement::asXML() — это метод, который вызывают, когда построение или изменение XML с помощью SimpleXML завершено и нужно получить результат обратно: либо в виде строки, которую можно вывести, вернуть или сохранить, либо записав её непосредственно в файл. По сути это обратная операция к simplexml_load_string(): если загрузка превращает текст XML в объект для навигации, то asXML() преобразует этот объект обратно в текст XML.

На этой странице рассматриваются два режима работы метода, что он возвращает, как ведёт себя на отдельном узле в сравнении со всем документом, а также подводные камни, с которыми сталкиваются разработчики (нет красивого форматирования, нет объявления XML на дочерних узлах).

Синтаксис

// Режим 1: вернуть XML в виде строки
public SimpleXMLElement::asXML(): string|false

// Режим 2: записать XML в файл, вернуть true/false
public SimpleXMLElement::asXML(string $filename): bool
  • $filename (необязательный) — если указан, XML записывается по этому пути, а метод возвращает true в случае успеха или false при ошибке. Если не указан, XML возвращается в виде строки.

asXML() и saveXML() являются псевдонимами — они делают абсолютно одно и то же.

Возврат XML в виде строки

Вызовите asXML() без аргументов, чтобы получить документ в виде строки. Это самый распространённый вариант использования: сериализация с последующим выводом, логированием или отправкой в теле HTTP-ответа.

php— editable, runs on the server

Вывод:

<?xml version="1.0"?>
<books><book><title>PHP Basics</title><author>John Doe</author></book></books>

Мы строим дерево с помощью addChild(), затем asXML() сериализует всё целиком. Обратите внимание: вывод находится в одной строке — SimpleXML не делает отступов и не форматирует результат. Смотрите раздел Подводные камни ниже, чтобы узнать, как отформатировать вывод.

Вызов asXML() на отдельном узле

asXML() работает на любом элементе, а не только на корне документа. При вызове на дочернем узле сериализуется только этот узел и его потомки — и, что важно, объявление <?xml ... ?> опускается, поскольку фрагмент не является самостоятельным документом.

<?php

$xml = new SimpleXMLElement(
    '<books><book><title>PHP Basics</title></book></books>'
);

// Весь документ — включает объявление XML
echo $xml->asXML(), "\n";

// Отдельный узел — без объявления, только фрагмент
echo $xml->book->title->asXML(), "\n";

Вывод:

<?xml version="1.0"?>
<books><book><title>PHP Basics</title></book></books>
<title>PHP Basics</title>

Это делает asXML() удобным инструментом для извлечения одной ветки большого документа в виде отдельного фрагмента.

Запись XML в файл

Передайте имя файла, и asXML() запишет документ туда вместо возврата строки. Возвращаемое значение — boolean, которое следует проверять, поскольку запись может завершиться ошибкой (неверный путь, нет прав доступа, диск переполнен).

<?php

$xml = new SimpleXMLElement('<config><host>localhost</host></config>');

if ($xml->asXML('config.xml')) {
    echo "Saved successfully\n";
} else {
    echo "Failed to write file\n";
}

При указании имени файла asXML() возвращает true (а не строку XML), поэтому не пытайтесь выводить его результат в ожидании разметки.

Подводные камни

  • Нет красивого форматирования. asXML() выдаёт компактный, однострочный XML. Чтобы добавить отступы, передайте строку в DOM:

    <?php
    
    $xml = new SimpleXMLElement('<a><b>hi</b></a>');
    
    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($xml->asXML());
    
    echo $dom->saveXML();

    Вывод:

    <?xml version="1.0"?>
    <a>
      <b>hi</b>
    </a>
  • В выводе дочернего узла нет объявления XML — строка <?xml ... ?> генерируется только для корня документа.

  • false означает ошибку. При записи в файл всегда проверяйте возвращаемый boolean, не рассчитывая на успех автоматически.

Связанные материалы

  • addChild() — построение дерева, которое затем сериализуется с помощью asXML().
  • saveXML() — псевдоним asXML().
  • children() и attributes() — навигация по объекту перед сериализацией.
  • Введение в SimpleXML — общий обзор расширения SimpleXML.

Заключение

SimpleXMLElement::asXML() сериализует объект SimpleXML обратно в текст XML. Без аргументов возвращает разметку в виде строки; при указании имени файла записывает документ на диск и возвращает boolean. Помните, что метод производит компактный вывод (используйте DOM, если нужны отступы), а вызов на дочернем узле даёт фрагмент без объявления.

Практика

Практика
Какова цель функции asXML() в PHP?
Какова цель функции asXML() в PHP?
Was this page helpful?