W3docs

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().

php— editable, runs on the server

Обе функции возвращают корневой элемент документа, а не обёртку вокруг него. Поэтому в приведённом выше примере $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.

Practice

Практика
Какой метод использует расширение SimpleXML PHP для разбора XML-файла?
Какой метод использует расширение SimpleXML PHP для разбора XML-файла?
Was this page helpful?