libxml_get_errors()
Функция libxml_get_errors() в PHP возвращает список ошибок, сгенерированных функциями libxml при разборе или валидации XML-документов.
Функция libxml_get_errors() в PHP получает список ошибок и предупреждений, сгенерированных функциями libxml — C-библиотекой, лежащей в основе расширений DOMDocument, SimpleXML и XMLReader в PHP. Обычно она вызывается после разбора или валидации XML-документа, чтобы точно определить, что пошло не так, вместо того чтобы полагаться на PHP-предупреждения.
На этой странице рассматриваются сигнатура функции, структура возвращаемых объектов ошибок, готовый запускаемый пример, способы интерпретации уровней серьёзности ошибок, а также связь с другими функциями обработки ошибок libxml.
Синтаксис
libxml_get_errors(): arrayФункция не принимает никаких аргументов и возвращает массив объектов LibXMLError. Если в буфере нет ошибок, она возвращает пустой массив ([]).
Что возвращает libxml_get_errors()
Каждый элемент возвращаемого массива является объектом LibXMLError со следующими публичными свойствами:
| Свойство | Тип | Описание |
|---|---|---|
level | int | Серьёзность: LIBXML_ERR_NONE (0), LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) или LIBXML_ERR_FATAL (3). |
code | int | Внутренний код ошибки libxml. |
message | string | Текст ошибки в читаемом виде (обратите внимание на завершающий символ \n). |
file | string | Имя файла или пустая строка при разборе строки в памяти. |
line | int | Номер строки, в которой произошла ошибка. |
column | int | Номер столбца, в котором произошла ошибка. |
Как использовать libxml_get_errors()
Есть одно обязательное правило: сначала нужно включить внутреннюю обработку ошибок. По умолчанию libxml выводит ошибки разбора непосредственно в PHP-вывод в виде предупреждений, а буфер ошибок остаётся пустым. Вызов libxml_use_internal_errors(true) перенаправляет эти ошибки во внутренний буфер, из которого их может прочитать libxml_get_errors().
Типичный рабочий процесс выглядит так:
- Вызовите
libxml_use_internal_errors(true)перед разбором. - Разберите или валидируйте XML (с помощью
DOMDocument,SimpleXMLи т.д.). - Вызовите
libxml_get_errors(), чтобы прочитать накопленные ошибки. - Вызовите
libxml_clear_errors(), чтобы очистить буфер перед следующей операцией.
Готовый запускаемый пример
В этом примере некорректный XML загружается из строки (без внешних файлов) и выводится каждая ошибка с её серьёзностью, строкой и столбцом:
<?php
// 1. Capture errors in the internal buffer instead of emitting warnings
libxml_use_internal_errors(true);
// Intentionally broken XML: <author> is never closed
$xml = <<<XML
<book>
<title>PHP Basics</title>
<author>Jane Doe
</book>
XML;
// 2. Parse it
$doc = new DOMDocument();
$doc->loadXML($xml);
// 3. Read the errors
$errors = libxml_get_errors();
// Map numeric levels to readable labels
$levels = [
LIBXML_ERR_WARNING => 'Warning',
LIBXML_ERR_ERROR => 'Error',
LIBXML_ERR_FATAL => 'Fatal',
];
foreach ($errors as $error) {
printf(
"[%s] line %d, col %d: %s",
$levels[$error->level] ?? 'Unknown',
$error->line,
$error->column,
$error->message // already ends with a newline
);
}
// 4. Clear the buffer so it doesn't leak into later parsing
libxml_clear_errors();
?>Вывод:
[Fatal] line 4, col 8: Opening and ending tag mismatch: author line 3 and book
[Fatal] line 4, col 8: Premature end of data in tag book line 1Поскольку тег <author> остаётся незакрытым, libxml сообщает о двух фатальных ошибках, каждая из которых указывает на точную строку и столбец, где была обнаружена проблема. Именно возможность читать level, line и column — а не только message — делает libxml_get_errors() таким полезным инструментом для формирования точной обратной связи при валидации.
Валидация по схеме
Тот же подход работает для валидации по схеме. После того как schemaValidate() / schemaValidateSource() вернёт false, ошибки валидации будут ждать в буфере:
<?php
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->load('example.xml');
// schemaValidateSource() validates against an in-memory XSD string
$xsd = file_get_contents('example.xsd');
if ($doc->schemaValidateSource($xsd)) {
echo "The XML document is valid.\n";
} else {
echo "The XML document is not valid:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message) . "\n";
}
}
libxml_clear_errors();
?>Совет: Если вам нужна только последняя ошибка, используйте
libxml_get_last_error()— она возвращает один объектLibXMLError(илиfalse), а не весь массив.
Типичные ошибки
- Пустой результат? Скорее всего, вы забыли вызвать
libxml_use_internal_errors(true). Без этого буфер никогда не заполняется. - Устаревшие ошибки. Буфер является общим для всех операций libxml в рамках запроса. Всегда вызывайте
libxml_clear_errors()после обработки пакета, иначе более ранние ошибки всплывут при следующем вызовеlibxml_get_errors(). - Предупреждения и фатальные ошибки. Непустой массив не обязательно означает, что документ непригоден для использования — фильтруйте по
$error->level >= LIBXML_ERR_ERROR, если хотите игнорировать предупреждения.
Связанные функции
libxml_use_internal_errors()— включение или отключение буфера ошибок.libxml_get_last_error()— получение только последней ошибки.libxml_clear_errors()— очистка буфера ошибок.- Обзор PHP libxml — общее описание расширения, которому принадлежат эти функции.
- PHP XML DOM — разбор документов с помощью
DOMDocument.
Заключение
Функция libxml_get_errors() является важным инструментом для отладки XML-операций в PHP. Включив внутреннюю обработку ошибок с помощью libxml_use_internal_errors(true), разобрав документ и проверив свойства level, line, column и message каждого объекта LibXMLError, вы сможете формировать точную и понятную пользователю обратную связь при валидации XML вместо того, чтобы просто подавлять PHP-предупреждения. Не забывайте очищать буфер с помощью libxml_clear_errors() между операциями.