W3docs

libxml_get_last_error()

Aprende a usar libxml_get_last_error() en PHP para recuperar el último error generado por la biblioteca libxml al analizar o validar XML.

La función libxml_get_last_error() en PHP recupera el último error generado por la biblioteca libxml — el analizador que potencia las extensiones DOMDocument, SimpleXML y XMLReader de PHP. Cuando analizas o validas XML mal formado, libxml registra lo que salió mal; esta función te permite leer el registro más reciente para mostrar un mensaje útil en lugar de una advertencia críptica.

Esta página explica qué devuelve la función, cómo capturar errores con libxml_use_internal_errors(), las propiedades del objeto de error y cuándo usar libxml_get_last_error() frente a las funciones relacionadas.

Sintaxis

libxml_get_last_error(): LibXMLError|false

La función no acepta ningún argumento. Devuelve:

  • Un objeto LibXMLError que describe el error más reciente, o
  • false si no se ha registrado ningún error desde la última llamada a libxml_clear_errors().

Por qué la necesitas

Por defecto, libxml emite errores como advertencias de PHP, lo que ensucia la salida y es difícil de manejar programáticamente. El patrón habitual es:

  1. Llama a libxml_use_internal_errors(true) para suprimir las advertencias y almacenar los errores en un búfer interno.
  2. Analiza o valida tu XML.
  3. Lee el búfer con libxml_get_last_error() (solo el más reciente) o libxml_get_errors() (todos ellos).
  4. Limpia el búfer con libxml_clear_errors() para que la siguiente operación comience limpia.

Usa libxml_get_last_error() cuando solo te interese qué acaba de fallar — por ejemplo, informar por qué una sola llamada de análisis no tuvo éxito.

El objeto LibXMLError

El objeto devuelto expone estas propiedades públicas:

PropiedadDescripción
levelSeveridad: LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) o LIBXML_ERR_FATAL (3).
codeEl código de error de libxml (un entero).
messageUna descripción legible del error.
fileEl archivo que desencadenó el error, o una cadena vacía cuando se analiza una cadena.
lineEl número de línea donde ocurrió el error.
columnEl número de columna donde ocurrió el error.

Ejemplo: capturar un error de análisis

Este ejemplo analiza una cadena XML intencionalmente rota (una etiqueta de cierre ausente) y luego imprime el error capturado. Es completamente autocontenido — no se necesita ningún archivo externo:

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

Salida:

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

El code, column y el texto del mensaje exactos dependen de tu versión de libxml, pero la estructura siempre es la misma. level es 3 (LIBXML_ERR_FATAL) porque la etiqueta sin cerrar hace que el documento no sea analizable. (code se omite de la salida anterior solo porque su valor es específico de la versión.)

Ejemplo: validar contra un esquema

Un uso real común es informar por qué un documento falló en la validación del esquema:

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

Aquí comprobamos el valor de retorno de libxml_get_last_error() contra false antes de acceder a $error->message — acceder a una propiedad en false generaría su propia advertencia.

Errores comunes

  • Debes habilitar el manejo interno de errores primero. Sin libxml_use_internal_errors(true), libxml imprime advertencias y el búfer interno permanece vacío, por lo que libxml_get_last_error() devuelve false.
  • Limpia el búfer entre operaciones. Los errores se acumulan. Si no llamas a libxml_clear_errors(), una llamada posterior a libxml_get_last_error() puede devolver un error obsoleto de un análisis anterior.
  • "Último" significa el más reciente, no "de esta llamada". La función devuelve lo que está al final del búfer, independientemente de qué análisis lo produjo.

Funciones relacionadas

Para un contexto más amplio sobre el análisis de XML en PHP, consulta The XML DOM in PHP y SimpleXML.

Conclusión

libxml_get_last_error() te proporciona acceso programático al error de análisis o validación de XML más reciente, convirtiendo los fallos silenciosos y las advertencias ruidosas en mensajes accionables. Combínala con libxml_use_internal_errors() para capturar errores y libxml_clear_errors() para restablecer el búfer, y usa libxml_get_errors() cuando necesites la lista completa en lugar de solo la más reciente.

Práctica

Práctica
¿Qué hace la función libxml_get_last_error() en PHP?
¿Qué hace la función libxml_get_last_error() en PHP?
Was this page helpful?