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-предупреждений, которые засоряют вывод и плохо поддаются программной обработке. Обычный шаблон таков:
- Вызвать
libxml_use_internal_errors(true), чтобы подавить предупреждения и записывать ошибки во внутренний буфер. - Разобрать или валидировать XML.
- Прочитать буфер с помощью
libxml_get_last_error()(только последняя ошибка) илиlibxml_get_errors()(все ошибки). - Очистить буфер с помощью
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() — когда нужен полный список, а не только последняя ошибка.