Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / PHP / Validación XML con Esquema XSD en PHP

Validación XML con Esquema XSD en PHP

Autor jc mouse jueves, febrero 14, 2019

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?

  • Netebans 8.2 Es el IDE que utilizaremos, si tu usas otro IDE no hay ningún problema
  • Archivos XML a validar y esquema de validación XSD. Estos archivos los usaremos de otro post «Validación XSD en Java«.
  • Conocimientos sobre XML y XSD
  • PHP 7

En tu IDE crea un nuevo proyecto con el nombre de «ValidacionXSD» con los siguientes archivos

proyecto php

  • MiEsquema.xsd Es el esquema con el cual se validara el archivo XML
  • Mi Formulario.xml El Archivo XML a validar
  • ValidacionXSD.php La clase que implementara los métodos de validación
  • index.php

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('&nbsp;', 6) . "Linea: $error->line<br>"
                    . str_repeat('&nbsp;', 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:

XSD Errores

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Multiplicación de matrices en Kotlin

Multiplicación de matrices en Kotlin

En este post implementaremos el código necesario para multiplicar matrices con el lenguaje Kotlin, pero para realizar es...

Instalación de Netbeans en Ubuntu

Instalación de Netbeans en Ubuntu

Netbeans es uno de los entornos de desarrollo integrado (Integrated Development Environment – IDE)  más conocidos...

Convertir objetos java en XML

Convertir objetos java en XML

Continuando con el estudio del meta lenguaje XML (Lenguaje de Marcado Extensible) bastante utilizado en el intercambio d...

Sonidos y Eventos en Swing

Sonidos y Eventos en Swing

La siguiente clase reproduce sonidos WAV en controles Swing de Java Netbeans, los controles son pasados en el constructo...

Cifrado francmasón PigPen

Cifrado francmasón PigPen

El cifrado francmasón es un cifrado por sustitución simple que cambia las letras por símbolos. Sin embargo, el uso de sí...

Procedimientos Almacenados: Parámetros INOUT

Procedimientos Almacenados: Parámetros INOUT

En post anteriores vimos lo que son los parámetros IN y los parámetros OUT pero existe otro tipo de parámetro que es la...

1 comentario en “Validación XML con Esquema XSD en PHP”

  1. Armando dice:

    Muy util, muchas gracias, por favor podrias hacer una guia para c#, Gracias de antemano

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

En muchas ocasiones es necesaria la personalización de componentes java para que estos se adecuen a nuestros requerimien...

En este post mostramos como personalizar el Header (encabezado) de un componente JTable en Java colocando iconos, centra...

El JTable de Java es un gran componente para mostrar datos en una tabla de una forma rápida y sencilla, sin embargo en v...

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi...

Herramientas

Generador de Enlaces a Whatsapp