W3docs

libxml_use_internal_errors()

Aprende a usar libxml_use_internal_errors() en PHP para habilitar o deshabilitar el manejo interno de errores de libxml.

La función libxml_use_internal_errors() te permite indicarle a las extensiones de PHP basadas en libxml (DOM, SimpleXML, XMLReader, XMLWriter) que dejen de imprimir advertencias en pantalla y, en su lugar, las recopilen en un búfer interno que puedes inspeccionar desde tu propio código.

Esta página explica qué hace la función, su firma y valor de retorno, y cómo combinarla con el resto de la API de errores de libxml para analizar XML con formato incorrecto de forma controlada.

¿Por qué usar el manejo interno de errores?

De forma predeterminada, cuando libxml encuentra XML malformado, genera advertencias de PHP. En una aplicación web, esas advertencias o bien saturan tu salida o se pierden silenciosamente dependiendo de la configuración de display_errors/error_reporting — y no tienes una forma estructurada de reaccionar ante ellas.

Llamar a libxml_use_internal_errors(true) cambia eso:

  • El análisis ya no emite advertencias de PHP. El script sigue ejecutándose.
  • Cada problema se envía al búfer interno como un objeto LibXMLError.
  • Tú decides qué hacer — registrarlo, mostrar un mensaje amigable, abortar o ignorar problemas no fatales.

Este es el patrón estándar para analizar XML que no controlas (cargas de usuarios, feeds de terceros, HTML extraído).

Sintaxis

libxml_use_internal_errors(?bool $use_errors = null): bool
  • $use_errors — pasa true para habilitar el manejo interno de errores, false para deshabilitarlo. Pasa null (u omite el argumento) para consultar el estado actual sin modificarlo.
  • Valor de retorno — la función devuelve la configuración anterior (un bool). Esto te permite restaurar el estado anterior cuando termines, sin afectar al código no relacionado.

Cómo usar libxml_use_internal_errors()

Habilita los errores internos, analiza el documento, luego lee el búfer con libxml_get_errors() y límpialo con libxml_clear_errors().

El siguiente ejemplo analiza XML malformado en línea (sin necesidad de un archivo externo, por lo que puedes ejecutarlo tal cual):

<?php
// 1. Route libxml warnings into the internal buffer.
libxml_use_internal_errors(true);

// 2. Deliberately broken XML: <from> is never closed.
$xml = <<<XML
<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani
</note>
XML;

$doc = new DOMDocument();
$doc->loadXML($xml);

// 3. Inspect what went wrong.
foreach (libxml_get_errors() as $error) {
    echo trim($error->message) . " (line {$error->line})\n";
}

// 4. Empty the buffer so later parses start clean.
libxml_clear_errors();
?>

Salida:

Opening and ending tag mismatch: from line 4 and note (line 5)
Premature end of data in tag note line 2 (line 5)

Observa que no se imprimió ninguna advertencia de PHP — el documento con errores produjo dos objetos de error estructurados en su lugar.

Leer un objeto LibXMLError

Cada elemento devuelto por libxml_get_errors() (o libxml_get_last_error()) es un objeto LibXMLError con campos útiles:

PropiedadSignificado
levelSeveridad: LIBXML_ERR_WARNING, LIBXML_ERR_ERROR, LIBXML_ERR_FATAL
codeCódigo numérico de error de libxml
messageDescripción legible (a menudo con un salto de línea al final)
lineNúmero de línea en el origen
columnNúmero de columna
fileNombre del archivo, o cadena vacía al analizar una cadena

Puedes usar level para ignorar advertencias inofensivas y aun así fallar en errores fatales:

<?php
libxml_use_internal_errors(true);

$doc = new DOMDocument();
$doc->loadXML('<a><b></a>'); // mismatched tags → fatal

$error = libxml_get_last_error();

if ($error && $error->level === LIBXML_ERR_FATAL) {
    echo "Fatal parse error (code {$error->code})\n";
}
?>

Salida:

Fatal parse error (code 77)

Restaurar el estado anterior

Dado que la función devuelve la configuración previa, una librería que activa los errores internos debería restaurarlos al terminar para no modificar el comportamiento del resto de la aplicación:

<?php
$previous = libxml_use_internal_errors(true);

// ... parse XML and handle libxml_get_errors() ...

libxml_clear_errors();
libxml_use_internal_errors($previous); // restore whatever the caller had
?>

Errores comunes

  • El búfer es global y persistente. Los errores se acumulan hasta que llamas a libxml_clear_errors() (o finaliza la solicitud). Siempre límpialo entre análisis, o volverás a leer errores obsoletos.
  • También afecta a la carga de HTML. DOMDocument::loadHTML() reporta el marcado inválido mediante el mismo mecanismo — práctico para extraer HTML imperfecto sin advertencias.
  • Deshabilitarlo reactiva las advertencias de PHP. Llamar a libxml_use_internal_errors(false) devuelve libxml a su comportamiento predeterminado de emitir advertencias/avisos.

Conclusión

libxml_use_internal_errors() es la puerta de entrada al manejo robusto de XML en PHP: actívala para silenciar las advertencias predeterminadas de libxml, luego usa libxml_get_errors(), libxml_get_last_error() y libxml_clear_errors() para inspeccionar y gestionar los problemas según tus propios criterios. Recuerda su valor de retorno para poder restaurar el estado anterior, y siempre limpia el búfer entre análisis.

Práctica

Práctica
¿Cuáles son los propósitos de la función 'libxml_use_internal_errors' en PHP?
¿Cuáles son los propósitos de la función 'libxml_use_internal_errors' en PHP?
Was this page helpful?