W3docs

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 со следующими публичными свойствами:

СвойствоТипОписание
levelintСерьёзность: LIBXML_ERR_NONE (0), LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) или LIBXML_ERR_FATAL (3).
codeintВнутренний код ошибки libxml.
messagestringТекст ошибки в читаемом виде (обратите внимание на завершающий символ \n).
filestringИмя файла или пустая строка при разборе строки в памяти.
lineintНомер строки, в которой произошла ошибка.
columnintНомер столбца, в котором произошла ошибка.

Как использовать libxml_get_errors()

Есть одно обязательное правило: сначала нужно включить внутреннюю обработку ошибок. По умолчанию libxml выводит ошибки разбора непосредственно в PHP-вывод в виде предупреждений, а буфер ошибок остаётся пустым. Вызов libxml_use_internal_errors(true) перенаправляет эти ошибки во внутренний буфер, из которого их может прочитать libxml_get_errors().

Типичный рабочий процесс выглядит так:

  1. Вызовите libxml_use_internal_errors(true) перед разбором.
  2. Разберите или валидируйте XML (с помощью DOMDocument, SimpleXML и т.д.).
  3. Вызовите libxml_get_errors(), чтобы прочитать накопленные ошибки.
  4. Вызовите 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_get_errors() является важным инструментом для отладки XML-операций в PHP. Включив внутреннюю обработку ошибок с помощью libxml_use_internal_errors(true), разобрав документ и проверив свойства level, line, column и message каждого объекта LibXMLError, вы сможете формировать точную и понятную пользователю обратную связь при валидации XML вместо того, чтобы просто подавлять PHP-предупреждения. Не забывайте очищать буфер с помощью libxml_clear_errors() между операциями.

Практика

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