Desactivar warning validación XSD en PHP

Si estás tratando de validar documentos XML en PHP muy probablemente estés usando la clase DOMDocument. Esta clase que nos permite crear una estructura de árbol de nodos de un documento XML, permite realizar una validación con un archivo XSD usando el método schemaValidate. Este método, además de retornar un valor booleano con el resultado de la validación, puede arrojar warnings no capturables por nuestro bloque try/catch.

Una solución sería establacer tu propio manejador de warnings y errores en el proyecto, cosa de la que no voy a hablar en esta entrada pero que puedes ver como realizar en los comentarios de usuarios en php.net sobre la funcion set_error_handler. En su lugar, lo que quiero enseñar es como desactivar estos warnings y errores que arroja el uso de DOMDocument:

Internamente PHP usa la libreria libxml para la manipulación de documentos XML. En el caso de detección de errores, por ejemplo, si trabajamos con un xml mal formado o si la validación XSD detecta nodos incorrectos, además de arrojar warnings la librería guarda una cola de errores detectados. Lo que vamos a hacer es decirle a libxml que no arroje warnings y que vamos a ser nosotros los que gestionemos esos errores a través de la cola que libxml crea. En este ejemplo, voy a desactivar el lanzamiento de errores y voy a lanzar una excepción con el primero de la cola de libxml (si existiese alguno trás trabajar con DOMDocument):

$previousState = libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadXML($message, LIBXML_NOBLANKS);
$dom->schemaValidate('validator.xsd');
$arrayErrors = libxml_get_errors();
libxml_clear_errors();


if (!empty($arrayErrors)) {
throw new Exception($arrayErrors[0]->message , 404);
}
libxml_use_internal_errors($previousState);

En este caso, $previousState va a aguardar el estado en el que se encontraba la activación de errores antes de mi uso, ya que esta cola puede ser compartida. Una vez finalizado nuestro tratamiento volvemos a poner el estado previo. La función libxml_use_internal_errors nos permite desactivar o activar el lanzamiento de errores (true o false) y tras instanciar la creación del documento DOM y su validación XSD, consultamos la cola de errores generados con la función libxml_get_errors, almacenando su contenido en el array $arrayErrors y vaciando la cola original de libxml con la función libxml_clear_errors (es conveniente realizar siempre este borrado para evitar problemas de memoria). Finalmente comprobamos que nuestro array no está vacío y en ese caso arrojamos la excepción.

Y eso es todo. Tan sólo añadir que disponemos también de la función libxml_get_last_error, que nos devolvería directamente el último error detectado de la cola de errores.

 

Etiquetado:, ,

Deja un comentario