Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / PHP / Validación XML con Esquema XSD en PHP

Validación XML con Esquema XSD en PHP

Por 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

Artículos similares

Botón Mágico

Magic Button, es un botón animado para android bajo licencia del MIT desarrollado por Bloder (Brasil), el proyecto esta[...]

Juego: Acierta los colores (Código Fuente)

Acierta los colores o Adivina los colores es un sencillo juego que consiste en que dado 6 colores «rojo», «verde», «salm[...]

WordPress: Crear un nuevo tema de bloques con Create Block Theme

Create Block Theme es el plugin oficial de WordPress para la creación y exportación de «Temas de Bloques» (Block Themes)[...]

Conectar SQL Server con PHP 8.x

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit[...]

Conexión RESTFUL con android y JSON

En este tutorial crearemos una sencilla aplicación android que nos permitirá conectarnos a un RESTFUL, obtener un result[...]

Aplicaciones java con Maven

¿Qué es Maven? Maven es una herramienta de software para la gestión y construcción de proyectos Java. Provee un conjunto[...]