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(): arrayNo 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:
| Propiedad | Tipo | Descripción |
|---|---|---|
level | int | Severidad: LIBXML_ERR_NONE (0), LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) o LIBXML_ERR_FATAL (3). |
code | int | El código de error interno de libxml. |
message | string | El mensaje de error legible por humanos (nota el \n al final). |
file | string | El nombre del archivo, o una cadena vacía al analizar una cadena en memoria. |
line | int | El número de línea donde ocurrió el error. |
column | int | El 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:
- Llamar a
libxml_use_internal_errors(true)antes de analizar. - Analizar o validar el XML (con
DOMDocument,SimpleXML, etc.). - Llamar a
libxml_get_errors()para leer los errores recopilados. - 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 1Debido 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 objetoLibXMLError(ofalse) 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 alibxml_get_errors(). - Advertencias vs. fatales. Un array no vacío no significa necesariamente que el documento sea inutilizable — filtra por
$error->level >= LIBXML_ERR_ERRORsi quieres ignorar las advertencias.
Funciones relacionadas
libxml_use_internal_errors()— activar o desactivar el búfer de errores.libxml_get_last_error()— obtener solo el error más reciente.libxml_clear_errors()— vaciar el búfer de errores.- Descripción general de PHP libxml — la extensión más amplia a la que pertenecen estas funciones.
- PHP XML DOM — análisis de documentos con
DOMDocument.
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.