simplexml_load_file()
SimpleXML — расширение PHP с простым API для работы с XML. Функция simplexml_load_file() загружает XML-файл в объект SimpleXMLElement.
Введение
simplexml_load_file() читает XML-файл с диска (или по URL) и преобразует его содержимое в объект SimpleXMLElement, по которому можно перемещаться с помощью обычного синтаксиса свойств и массивов PHP. Это файловая точка входа расширения SimpleXML — простейший способ превратить XML-документ во что-то, по чему можно итерировать и из чего можно читать данные.
Используйте её всякий раз, когда у вас есть XML-файл — конфигурационный файл, RSS/Atom-лента, ответ API, сохранённый на диск, или карта сайта — и вы хотите извлечь значения, не пишя парсер вручную. Если ваш XML находится в строке, а не в файле, используйте вместо неё функцию-аналог simplexml_load_string().
В этой главе рассматриваются сигнатура функции, полный рабочий пример (включая XML, который он читает), способы доступа к атрибутам и пространствам имён, а также обработка ошибок загрузки.
Синтаксис
simplexml_load_file(
string $filename,
?string $class_name = SimpleXMLElement::class,
int $options = 0,
string $namespace_or_prefix = "",
bool $is_prefix = false
): SimpleXMLElement|false| Параметр | Описание |
|---|---|
$filename | Путь или URL загружаемого XML-файла. |
$class_name | Класс для создания экземпляра. Должен наследоваться от SimpleXMLElement; по умолчанию — сам SimpleXMLElement. |
$options | Битовая маска констант параметров libxml, таких как LIBXML_NOCDATA или LIBXML_NOBLANKS. |
$namespace_or_prefix | Префикс пространства имён или URI для ограничения возвращаемого дерева. |
$is_prefix | true, если предыдущий аргумент является префиксом; false, если это URI. |
Возвращаемое значение: объект SimpleXMLElement при успехе или false, если файл не удаётся прочитать или он содержит некорректный XML.
Полный пример
Предположим, что рядом со скриптом находится файл books.xml:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="b1">
<title>The PHP Way</title>
<author>Jane Doe</author>
<price currency="USD">29.99</price>
</book>
<book id="b2">
<title>XML in Practice</title>
<author>John Smith</author>
<price currency="EUR">24.50</price>
</book>
</library>Загрузите его, убедитесь, что разбор прошёл успешно, и выполните итерацию по элементам <book>:
<?php
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML file.\n";
exit(1);
}
foreach ($xml->book as $book) {
echo $book->title . " by " . $book->author . "\n";
}Вывод:
The PHP Way by Jane Doe
XML in Practice by John SmithОбратите внимание на строгое сравнение === false. Объекты SimpleXML являются «истинными» (truthy), поэтому слабая проверка if (!$xml) может некорректно работать в граничных случаях — всегда явно сравнивайте с false.
Чтение атрибутов
SimpleXML предоставляет дочерние элементы как свойства объекта ($book->title), а XML-атрибуты — через доступ в стиле массива ($book['id']). Поскольку значения являются объектами SimpleXMLElement, а не обычными строками, приводите их с помощью (string) перед использованием в вычислениях или сравнениях:
<?php
$xml = simplexml_load_file('books.xml');
foreach ($xml->book as $book) {
$id = (string) $book['id'];
$currency = (string) $book->price['currency'];
echo "{$id}: {$book->title} — {$book->price} {$currency}\n";
}Вывод:
b1: The PHP Way — 29.99 USD
b2: XML in Practice — 24.50 EURРабота с пространствами имён
Когда документ объявляет XML-пространства имён, обычный доступ к свойствам работает только для пространства имён по умолчанию. Используйте ->children($namespaceUri) для перехода в ветку с пространством имён и ->attributes($namespaceUri) для чтения атрибутов с пространством имён:
<?php
// Access elements in the Atom namespace.
$atom = $xml->children('http://www.w3.org/2005/Atom');
echo $atom->title;Для более подробного изучения пространств имён и обхода документа смотрите SimpleXML в PHP.
Корректная обработка ошибок загрузки
По умолчанию некорректный XML генерирует предупреждения PHP. Чтобы подавить их и самостоятельно проверить ошибки, включите внутреннюю обработку ошибок с помощью libxml_use_internal_errors() перед загрузкой:
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_file('missing.xml');
if ($xml === false) {
echo "Could not load the file:\n";
foreach (libxml_get_errors() as $error) {
echo " " . trim($error->message) . "\n";
}
libxml_clear_errors();
}Вывод:
Could not load the file:
failed to load external entity "missing.xml"Этот шаблон сохраняет чистоту вывода и даёт структурированный доступ к каждой ошибке разбора через libxml_get_errors().
Типичные ловушки
falseи предупреждение. Отсутствующий файл или синтаксическая ошибка возвращаетfalseи вызывает предупреждение, если не включена внутренняя обработка ошибок. Всегда проверяйте возвращаемое значение.- Приведение перед сравнением.
$book->price == 29.99работает случайно;(float) $book->price === 29.99— это именно то, что вам нужно. - Чтение удалённых файлов.
$filenameможет быть URL, но это требует включенияallow_url_fopenвphp.ini. - Запись обратно. SimpleXML отлично подходит для чтения. Чтобы сериализовать элемент обратно в XML-строку, вызовите
asXML().
Заключение
simplexml_load_file() — это самый быстрый способ загрузить XML-файл в навигируемое дерево объектов в PHP. Сочетайте её со строгими проверками === false, приведением (string) при чтении значений и обработкой ошибок libxml, и у вас будет надёжная основа для работы с лентами, конфигурациями и XML API. Для строкового ввода используйте simplexml_load_string(), а для полного изучения методов обхода переходите к SimpleXML в PHP.