En este post realizaremos un pequeño ejemplo de validación de archivos XML utilizando el esquema XSD y el lenguaje PHP (acrónimo recursivo de PHP: Hypertext Preprocessor). Pero antes recordemos que es la «Validación de documentos XML» pues bien, validar un documento XML es comprobar que dicho documento está bien formado y se ajuste a una estructura definida ya sea bajo un DTD (Document Type Definition) o un XSD (XML Schema Definition)
¿Que necesitamos?
En tu IDE crea un nuevo proyecto con el nombre de «ValidacionXSD» con los siguientes archivos
Tanto el archivo MiEsquema.xsd como MiFormulario.xml están descritos en el post «Validacion XSD en Java» por lo que no entraremos a más detalles.
El código para ValidacionXSD.php es el siguiente:
<?php declare(strict_types = 1); /** * @see https://www.jc-mouse.net/ * @author mouse */ class ValidacionXSD { private $errors; private $doc; function __construct() { //Representa un documento HTML o XML en su totalidad; $this->doc = new \DOMDocument('1.0', 'utf-8'); } /** * @param String $filexml Archivo XML a validar * @param String $xsd Esquema de validacion * * @return bool TRUE El arcivo XML es valido * FALSE El archiv XML no es valido */ public function validar(string $filexml, string $xsd): bool { if (!file_exists($filexml) || !file_exists($xsd)) { echo "Archivo <b>$filexml</b> o <b>$xsd</b> no existe."; return false; } //Habilita/Deshabilita errores libxml y permite al usuario extraer //información de errores según sea necesario libxml_use_internal_errors(true); //lee archivo XML $myfile = fopen($filexml, "r"); $contents = fread($myfile, filesize($filexml)); $this->doc->loadXML($contents, LIBXML_NOBLANKS); fclose($myfile); // Valida un documento basado en un esquema if (!$this->doc->schemaValidate($xsd)) { //Recupera un array de errores $this->errors = libxml_get_errors(); return false; } return true; } /** * Retorna un string con los errores de validacion si es que existieran */ public function mostrarError(): string { $msg = ''; if ($this->errors == NULL) { return ''; } foreach ($this->errors as $error) { switch ($error->level) { case LIBXML_ERR_WARNING: $nivel = 'Warning'; break; case LIBXML_ERR_ERROR : $nivel = 'Error'; break; case LIBXML_ERR_FATAL: $nivel = 'Fatal Error'; break; } $msg .= "<b>Error $error->code [$nivel]:</b><br>" . str_repeat(' ', 6) . "Linea: $error->line<br>" . str_repeat(' ', 6) . "Mensaje: $error->message<br>"; } //Limpia el buffer de errores de libxml libxml_clear_errors(); return $msg; } function getErrors() { return $this->errors; } function setErrors($errors) { $this->errors = $errors; } }
Para terminar en el archivo index.php escribimos:
<?php require 'ValidacionXSD.php'; $valXSD = new ValidacionXSD(); if(!$valXSD->validar('MiFormulario.xml','MiEsquema.xsd')){ print $valXSD->mostrarError(); }
Si el archivo XML es valido no obtendremos nada por pantalla, caso contrario:
enjoy!!!
HyperSQL DataBase (HSQLDB) es un moderno administrador de bases de datos relacionales, es portátil e implementado en jav[...]
Control de versiones: Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los eleme[...]
El archuivo helpers.php en Laravel contiene funciones globales de PHP los cuales se pueden utilizar en cualquier parte d[...]
Hace un tiempo hablamos sobre ExifTool, una pequeña pero potente herramienta para la lectura y edición de metadatos de[...]
En un post anterior se vio como agregar un código DataMatrix en reportes con iReport Designer sin embargo actualmente el[...]
La clase Canvas (Lienzo) de Android es una superficie que nos permite pintar figuras, texto e imágenes utilizando para[...]