W3docs

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_prefixtrue, если предыдущий аргумент является префиксом; 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.

Практика

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