PHP SimpleXML - simplexml_load_file и simplexml_load_string
Расширение SimpleXML в PHP предоставляет простой способ разбора и обработки XML-данных. Узнайте о simplexml_load_file и simplexml_load_string.
Как получить и читать XML с помощью PHP SimpleXML
Расширение PHP SimpleXML — это самый быстрый способ читать и редактировать XML-документы. Вместо того чтобы вручную обходить дерево узлов, SimpleXML превращает весь документ в обычный PHP-объект, элементы которого доступны через привычный синтаксис свойств и массивов — $xml->title, $xml->item[0], $xml['id'].
В этой главе рассматриваются две функции для загрузки XML — simplexml_load_file() (для файла или URL) и simplexml_load_string() (для XML, уже находящегося в строке), — а также способы чтения элементов и атрибутов, обхода повторяющихся узлов, добавления новых данных и сериализации результата обратно в XML.
SimpleXML входит в стандартный дистрибутив PHP и включён по умолчанию, поэтому обычно ничего дополнительно устанавливать не нужно.
Когда использовать SimpleXML (и когда не стоит)
- Используйте SimpleXML для чтения и лёгкого редактирования правильно сформированного XML: конфигурационных файлов, RSS/Atom-лент, простых ответов API, карт сайта.
- Обратитесь к DOMDocument, когда нужен детальный контроль: вставка узлов в определённую позицию, работа с комментариями или валидация по схеме.
- Используйте XML Parser (Expat) для очень больших документов, которые нужно обрабатывать потоком событий без загрузки всего содержимого в память.
Загрузка XML-данных
Первый шаг — поместить XML в объект SimpleXML. Существуют две точки входа, и выбор между ними зависит только от того, где в данный момент находится ваш XML.
Загрузка XML-файла с помощью simplexml_load_file()
simplexml_load_file() читает XML из локального пути или URL и возвращает объект SimpleXMLElement. При ошибке разбора возвращает false и генерирует предупреждение.
<?php
// books.xml on disk, or "https://example.com/feed.xml"
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML.";
} else {
echo $xml->book[0]->title; // first <title>
}Загрузка XML-строки с помощью simplexml_load_string()
Когда XML уже находится в переменной — например, в теле HTTP-ответа — используйте simplexml_load_string().
Обе функции возвращают корневой элемент документа, а не обёртку вокруг него. Поэтому в приведённом выше примере $xml является <root>, а $xml->child — узел <child> внутри него.
Совет:
SimpleXMLElementхранит строкоподобное значение, но по-прежнему является объектом. Приводите его к(string)(или используйте конкатенацию) всякий раз, когда нужна обычная строка PHP — например$title = (string) $xml->book[0]->title;. Подробнее см. в разделе преобразование SimpleXML в строку.
Доступ к XML-данным
После загрузки документ читается с помощью синтаксиса объектов и массивов.
Доступ к элементам
Дочерние элементы — это свойства объекта. Когда тег повторяется, обращайтесь к нему как к массиву; [0] — это первое вхождение.
<?php
$data = <<<XML
<library>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</library>
XML;
$xml = simplexml_load_string($data);
echo $xml->book[0]->title, "\n"; // PHP Basics
echo $xml->book[1]->title, "\n"; // Advanced XMLОбход повторяющихся элементов
Поскольку повторяющиеся теги ведут себя как итерируемый список, foreach — естественный способ прочитать все из них:
<?php
$data = <<<XML
<library>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</library>
XML;
$xml = simplexml_load_string($data);
foreach ($xml->book as $book) {
echo $book->title, "\n";
}
// PHP Basics
// Advanced XMLДоступ к атрибутам
Доступ к атрибутам осуществляется с помощью синтаксиса массива для элемента, которому они принадлежат:
<?php
$xml = simplexml_load_string('<book id="42" lang="en"><title>PHP</title></book>');
echo $xml['id'], "\n"; // 42
echo $xml['lang'], "\n"; // enИзменение XML-данных
SimpleXML также позволяет создавать и редактировать документы на месте.
Добавление элементов
addChild() добавляет новый элемент и возвращает созданный элемент, что позволяет выстраивать цепочки вызовов:
<?php
$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');
echo $xml->child; // ValueДобавление атрибутов
addAttribute() добавляет атрибут к тому элементу, на котором вызван:
<?php
$xml = simplexml_load_string('<root><child>Value</child></root>');
$xml->child->addAttribute('attribute', 'on');
echo $xml->child['attribute']; // onПреобразование SimpleXML обратно в XML
asXML() сериализует объект обратно в XML-строку (без аргумента) или записывает её в файл (при передаче пути). Это способ сохранить внесённые изменения. Подробнее см. в разделе метод asXML.
<?php
$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');
echo $xml->asXML();
// <?xml version="1.0"?>
// <root><child>Value</child></root>Обработка некорректного XML
При ошибке эти функции возвращают false и генерируют предупреждение, с которым неудобно работать. Используйте libxml_use_internal_errors(), чтобы перехватывать предупреждения как коллекцию ошибок:
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_string('<root><child></root>'); // missing </child>
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo trim($error->message), "\n";
}
libxml_clear_errors();
}Заключение
SimpleXML — это самый быстрый путь от XML-файла или строки к читаемым PHP-данным. Загружайте с помощью simplexml_load_file() или simplexml_load_string(), читайте элементы и атрибуты через синтаксис свойств и массивов, обходите повторяющиеся узлы с foreach, редактируйте с помощью addChild() и addAttribute(), и сериализуйте обратно с asXML(). Для более сложной обработки переходите к DOMDocument; для потоковой обработки больших файлов используйте XML Parser.