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-ответа.
Вывод:
<?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, если нужны отступы), а вызов на дочернем узле даёт фрагмент без объявления.