W3docs

libxml_get_errors()

Aprende a usar libxml_get_errors() en PHP para recuperar errores generados por las funciones libxml al analizar o validar documentos XML.

La función libxml_get_errors() en PHP recupera la lista de errores y advertencias generados por las funciones libxml — la biblioteca C que impulsa las extensiones DOMDocument, SimpleXML y XMLReader de PHP. Generalmente se llama después de analizar o validar un documento XML para poder inspeccionar exactamente qué salió mal en lugar de depender de las advertencias de PHP.

Esta página cubre la firma de la función, la estructura de los objetos de error que devuelve, un ejemplo ejecutable autocontenido, cómo leer los niveles de severidad de los errores y cómo se relaciona con las demás funciones de error de libxml.

Sintaxis

libxml_get_errors(): array

No toma ningún argumento y devuelve un array de objetos LibXMLError. Si no hay errores en el búfer, devuelve un array vacío ([]).

Qué devuelve libxml_get_errors()

Cada elemento del array devuelto es un objeto LibXMLError con estas propiedades públicas:

PropiedadTipoDescripción
levelintSeveridad: LIBXML_ERR_NONE (0), LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) o LIBXML_ERR_FATAL (3).
codeintEl código de error interno de libxml.
messagestringEl mensaje de error legible por humanos (nota el \n al final).
filestringEl nombre del archivo, o una cadena vacía al analizar una cadena en memoria.
lineintEl número de línea donde ocurrió el error.
columnintEl número de columna donde ocurrió el error.

Cómo usar libxml_get_errors()

Hay una regla que debes seguir: habilitar el manejo interno de errores primero. Por defecto, libxml escribe los errores de análisis directamente en la salida de PHP como advertencias, y el búfer de errores permanece vacío. Llamar a libxml_use_internal_errors(true) redirige esos errores a un búfer interno que libxml_get_errors() puede leer.

El flujo de trabajo típico es:

  1. Llamar a libxml_use_internal_errors(true) antes de analizar.
  2. Analizar o validar el XML (con DOMDocument, SimpleXML, etc.).
  3. Llamar a libxml_get_errors() para leer los errores recopilados.
  4. Llamar a libxml_clear_errors() para vaciar el búfer antes de la próxima operación.

Un ejemplo ejecutable autocontenido

Este ejemplo carga XML malformado desde una cadena (sin necesidad de archivos externos) e imprime cada error con su severidad, línea y columna:

<?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();
?>

Salida:

[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

Debido a que la etiqueta <author> queda abierta, libxml reporta dos errores fatales, cada uno apuntando a la línea y columna exactas donde detectó el problema. Leer level, line y column — en lugar de solo message — es lo que hace que libxml_get_errors() sea tan útil para construir retroalimentación de validación precisa.

Validar contra un esquema

El mismo patrón funciona para la validación de esquemas. Después de que schemaValidate() / schemaValidateSource() devuelve false, los errores de validación están esperando en el búfer:

<?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();
?>

Consejo: Si solo necesitas el problema más reciente, usa libxml_get_last_error() en su lugar — devuelve un objeto LibXMLError (o false) en lugar de todo el array.

Problemas comunes

  • ¿Resultado vacío? Casi con certeza olvidaste libxml_use_internal_errors(true). Sin ello, el búfer nunca se llena.
  • Errores obsoletos. El búfer se comparte entre todas las operaciones libxml en la solicitud. Siempre llama a libxml_clear_errors() después de terminar de procesar un lote, o los errores anteriores reaparecerán en una llamada posterior a libxml_get_errors().
  • Advertencias vs. fatales. Un array no vacío no significa necesariamente que el documento sea inutilizable — filtra por $error->level >= LIBXML_ERR_ERROR si quieres ignorar las advertencias.

Funciones relacionadas

Conclusión

La función libxml_get_errors() es una herramienta esencial para depurar operaciones XML en PHP. Al habilitar el manejo interno de errores con libxml_use_internal_errors(true), analizar el documento e inspeccionar el level, line, column y message de cada objeto LibXMLError, puedes construir una validación XML precisa y amigable para el usuario en lugar de engullir advertencias crudas de PHP. Recuerda limpiar el búfer con libxml_clear_errors() entre operaciones.

Práctica

Práctica
¿Cuál es el propósito de la función libxml_get_errors() en PHP?
¿Cuál es el propósito de la función libxml_get_errors() en PHP?
Was this page helpful?