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|falseLa función no acepta ningún argumento. Devuelve:
- Un objeto
LibXMLErrorque describe el error más reciente, o falsesi no se ha registrado ningún error desde la última llamada alibxml_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:
- Llama a
libxml_use_internal_errors(true)para suprimir las advertencias y almacenar los errores en un búfer interno. - Analiza o valida tu XML.
- Lee el búfer con
libxml_get_last_error()(solo el más reciente) olibxml_get_errors()(todos ellos). - 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:
| Propiedad | Descripción |
|---|---|
level | Severidad: LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) o LIBXML_ERR_FATAL (3). |
code | El código de error de libxml (un entero). |
message | Una descripción legible del error. |
file | El archivo que desencadenó el error, o una cadena vacía cuando se analiza una cadena. |
line | El número de línea donde ocurrió el error. |
column | El 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 1El
code,columny el texto del mensaje exactos dependen de tu versión de libxml, pero la estructura siempre es la misma.leveles3(LIBXML_ERR_FATAL) porque la etiqueta sin cerrar hace que el documento no sea analizable. (codese 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 quelibxml_get_last_error()devuelvefalse. - Limpia el búfer entre operaciones. Los errores se acumulan. Si no llamas a
libxml_clear_errors(), una llamada posterior alibxml_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
libxml_get_errors()— devuelve un array de todos los errores almacenados en el búfer, no solo el más reciente.libxml_clear_errors()— vacía el búfer de errores.libxml_use_internal_errors()— activa o desactiva si los errores se almacenan en el búfer o se emiten como advertencias.
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.