W3docs

libxml_get_last_error()

Функция libxml_get_last_error() в PHP возвращает последнюю ошибку, сгенерированную библиотекой libxml при разборе или валидации XML.

Функция libxml_get_last_error() в PHP извлекает последнюю ошибку, сгенерированную библиотекой libxml — парсером, который лежит в основе расширений DOMDocument, SimpleXML и XMLReader. Когда вы разбираете или валидируете некорректный XML, libxml фиксирует, что пошло не так; эта функция позволяет прочитать наиболее свежую запись, чтобы вывести понятное сообщение вместо загадочного предупреждения.

На этой странице рассматривается, что возвращает функция, как перехватывать ошибки с помощью libxml_use_internal_errors(), свойства объекта ошибки и когда использовать libxml_get_last_error(), а когда — связанные функции.

Синтаксис

libxml_get_last_error(): LibXMLError|false

Функция не принимает никаких аргументов. Она возвращает:

  • Объект LibXMLError, описывающий последнюю ошибку, или
  • false, если с момента последнего вызова libxml_clear_errors() ошибок не было зафиксировано.

Зачем она нужна

По умолчанию libxml выводит ошибки в виде PHP-предупреждений, которые засоряют вывод и плохо поддаются программной обработке. Обычный шаблон таков:

  1. Вызвать libxml_use_internal_errors(true), чтобы подавить предупреждения и записывать ошибки во внутренний буфер.
  2. Разобрать или валидировать XML.
  3. Прочитать буфер с помощью libxml_get_last_error() (только последняя ошибка) или libxml_get_errors() (все ошибки).
  4. Очистить буфер с помощью libxml_clear_errors(), чтобы следующая операция начиналась чисто.

Используйте libxml_get_last_error(), когда вас интересует только что именно не удалось — например, для сообщения о причине неудачного разбора.

Объект LibXMLError

Возвращаемый объект предоставляет следующие публичные свойства:

СвойствоОписание
levelСерьёзность: LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) или LIBXML_ERR_FATAL (3).
codeКод ошибки libxml (целое число).
messageЧеловекочитаемое описание ошибки.
fileФайл, в котором возникла ошибка, или пустая строка при разборе строки.
lineНомер строки, где произошла ошибка.
columnНомер столбца, где произошла ошибка.

Пример: перехват ошибки разбора

В этом примере разбирается намеренно повреждённая строка XML (отсутствует закрывающий тег), после чего выводится перехваченная ошибка. Пример полностью самодостаточен — внешние файлы не нужны:

<?php
// Store libxml errors in an internal buffer instead of emitting warnings
libxml_use_internal_errors(true);

// This XML is malformed: <title> is never closed
$badXml = '<book><title>PHP</book>';

$doc = new DOMDocument();
$doc->loadXML($badXml);

$error = libxml_get_last_error();

if ($error !== false) {
    echo "Error level:  " . $error->level   . PHP_EOL;
    echo "Error code:   " . $error->code    . PHP_EOL;
    echo "Line:         " . $error->line     . PHP_EOL;
    echo "Message:      " . trim($error->message) . PHP_EOL;
} else {
    echo "The XML parsed without errors." . PHP_EOL;
}

// Always clear the buffer when you are done with it
libxml_clear_errors();
?>

Вывод:

Error level:  3
Line:         1
Message:      Premature end of data in tag book line 1

Точные значения code, column и текст сообщения зависят от версии libxml, однако структура всегда одинакова. level равен 3 (LIBXML_ERR_FATAL), потому что незакрытый тег делает документ невозможным для разбора. (code опущен из вывода выше только потому, что его значение зависит от версии.)

Пример: валидация по схеме

Распространённый практический случай — сообщение о причине, по которой документ не прошёл валидацию по схеме:

<?php
libxml_use_internal_errors(true);

$doc = new DOMDocument();
$doc->load('example.xml');

if ($doc->schemaValidate('example.xsd')) {
    echo "The XML document is valid.";
} else {
    $error = libxml_get_last_error();
    if ($error !== false) {
        echo "Validation failed: " . trim($error->message);
    }
}

libxml_clear_errors();
?>

Здесь мы проверяем возвращаемое значение libxml_get_last_error() на false перед обращением к $error->message — попытка обратиться к свойству false вызовет собственное предупреждение.

Распространённые ошибки

  • Необходимо сначала включить внутреннюю обработку ошибок. Без libxml_use_internal_errors(true) libxml выводит предупреждения, а внутренний буфер остаётся пустым, поэтому libxml_get_last_error() вернёт false.
  • Очищайте буфер между операциями. Ошибки накапливаются. Если не вызывать libxml_clear_errors(), последующий вызов libxml_get_last_error() может вернуть устаревшую ошибку от более раннего разбора.
  • «Последняя» означает последнюю в буфере, а не «из этого вызова». Функция возвращает то, что находится в конце буфера, вне зависимости от того, какой разбор её породил.

Связанные функции

  • libxml_get_errors() — возвращает массив всех буферизованных ошибок, а не только последнюю.
  • libxml_clear_errors() — очищает буфер ошибок.
  • libxml_use_internal_errors() — переключает режим: буферизация ошибок или вывод их в виде предупреждений.

Для более широкого контекста о разборе XML в PHP смотрите The XML DOM in PHP и SimpleXML.

Заключение

libxml_get_last_error() предоставляет программный доступ к последней ошибке разбора или валидации XML, превращая скрытые сбои и шумные предупреждения в понятные сообщения. Используйте её в связке с libxml_use_internal_errors() для перехвата ошибок и libxml_clear_errors() для сброса буфера, а libxml_get_errors() — когда нужен полный список, а не только последняя ошибка.

Практика

Практика
Что делает функция libxml_get_last_error() в PHP?
Что делает функция libxml_get_last_error() в PHP?
Was this page helpful?