Zamora|León|Oviedo, España

BLOG

✔ Cómo validar documentos XML, DTDs y SCHEMA con XML Copy Editor

✔ Cómo validar documentos XML, DTDs y SCHEMA con XML Copy Editor

Validar ficheros XML con sus respectivos DTD y SCHEMA es sumamente sencillo con la herramienta XML Copy Editor. A la hora de programar en XML, es muy útil saber si la sintaxis es correcta y si nuestro XML cumple con las especificaciones del DTD y/ó el SCHEMA. Os enseñaré como se puede realizar una rápida validación para estar seguros de que nuestros desarrollos son correctos antes de pasarlos a un entorno productivo. Si quieres aprender, sigue leyendo...

 

¿QUE ES XML?

XML, siglas en inglés de eXtensible Markup Language, traducido como "Lenguaje de Marcado Extensible" o "Lenguaje de Marcas Extensible", es un meta-lenguaje que permite definir lenguajes de marcas desarrollado por el World Wide Web Consortium (W3C) utilizado para almacenar datos en forma legible. Proviene del lenguaje SGML y permite definir la gramática de lenguajes específicos (de la misma manera que HTML es a su vez un lenguaje definido por SGML) para estructurar documentos grandes. A diferencia de otros lenguajes, XML da soporte a bases de datos, siendo útil cuando varias aplicaciones deben comunicarse entre sí o integrar información.1

XML no ha nacido únicamente para su aplicación en Internet, sino que se propone como un estándar para el intercambio de información estructurada entre diferentes plataformas. Se puede usar en bases de datos, editores de texto, hojas de cálculo y casi cualquier cosa imaginable.

XML es una tecnología sencilla que tiene a su alrededor otras que la complementan y la hacen mucho más grande, con unas posibilidades mucho mayores. Tiene un papel muy importante en la actualidad ya que permite la compatibilidad entre sistemas para compartir la información de una manera segura, fiable y fácil.

 

VENTAJAS DEL XML

  • Es extensible: Después de diseñado y puesto en producción, es posible extender XML con la adición de nuevas etiquetas, de modo que se pueda continuar utilizando sin complicación alguna.
  • El analizador es un componente estándar, no es necesario crear un analizador específico para cada versión de lenguaje XML. Esto posibilita el empleo de cualquiera de los analizadores disponibles. De esta manera se evitan bugs y se acelera el desarrollo de aplicaciones.
  • Si un tercero decide usar un documento creado en XML, es sencillo entender su estructura y procesarla. Mejora la compatibilidad entre aplicaciones. Podemos comunicar aplicaciones de distintas plataformas, sin que importe el origen de los datos, es decir, podríamos tener una aplicación en Linux con una base de datos Postgres y comunicarla con otra aplicación en Windows y Base de Datos MS-SQL Server.
  • Transformamos datos en información, pues se les añade un significado concreto y los asociamos a un contexto, con lo cual tenemos flexibilidad para estructurar documentos.

 

DOCUMENTOS XML BIEN FORMADOS Y CONTROL DE ERRORES

Los documentos denominados como «bien formados» (del inglés well formed) son aquellos que cumplen con todas las definiciones básicas de formato y pueden, por lo tanto, analizarse correctamente por cualquier analizador sintáctico (parser) que cumpla con la norma. Se separa esto del concepto de validez que se explica más adelante.

  • Los documentos han de seguir una estructura estrictamente jerárquica con lo que respecta a las etiquetas que delimitan sus elementos. Una etiqueta debe estar correctamente incluida en otra, es decir, las etiquetas deben estar correctamente anidadas. Los elementos con contenido deben estar correctamente cerrados.
  • Los documentos XML solamente permiten un elemento raíz del que todos los demás sean parte, es decir, solo pueden tener un elemento inicial.
  • Los valores atributos en XML siempre deben estar encerrados entre comillas simples o dobles.
  • El XML es sensible a mayúsculas y minúsculas. Existe un conjunto de caracteres llamados espacios en blanco (espacios, tabuladores, retornos de carro, saltos de línea) que los procesadores XML tratan de forma diferente en el marcado XML.
  • Es necesario asignar nombres a las estructuras, tipos de elementos, entidades, elementos particulares, etc. En XML los nombres tienen alguna característica en común.
  • Las construcciones como etiquetas, referencias de entidad y declaraciones se denominan marcas; son partes del documento que el procesador XML espera entender. El resto del documento entre marcas son los datos «entendibles» por las personas.

 


1.- ELEMENTOS USADOS EN ESTE TUTORIAL
  • Windows 7 64 bits
  • XML Copy Editor 1.2.1.3

 

 

2.- DESCARGA E INSTALACIÓN DE XML COPY EDITOR

Para instalar XML Copy Editor debemos descargarla preferiblemente de su Web Oficial alojada en http://xml-copy-editor.sourceforge.net/. El programa está disponible para Windows, Ubuntu (*.deb) y en código fuente. Una vez descargado el programa, lo instalaremos de la forma habitual en función del Sistema Operativo con el que trabajemos.

XML Copy EditorPantalla principal XML Copy Editor

 

 

2.- VALIDAR XML SIMPLE

Podemos comprobar si nuestro XML está bien formado y validarlo para ver si cumple con nuestros dtd y schemas. Para ello, abriremos nuestro fichero XML y tenemos 2 opciones: comprobar bien formado y validar. Para comprobar si está bien formado nuestro XML haremos click en el tick azul. Veremos un mensaje en la parte inferior indicando si es correcto o no:

XML Copy EditorComprobar sintaxis

 

Para comprobar si el XML está correcto tanto a nivel sintáctico, como si cumple con los esquemas y dtd asociados, haremos click en el check verde:

XML Copy EditorValidación correcta de XML

 

 

El código del XML usado en este ejemplo es el siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
  Autor: Raúl Prieto Fernández
-->
<!DOCTYPE pedidos
[
<!ELEMENT pedidos (pedido)*>
<!ELEMENT pedido (cod_pedido|sucursal|direccion|nombre_trabajador|fecha_pedido|observaciones|plazo_revision|codigo_articulo|unidades|precio_unidad|observaciones_articulo)*>
<!ELEMENT cod_pedido (#PCDATA)>
<!ELEMENT sucursal (#PCDATA)>
<!ELEMENT direccion (#PCDATA)>
<!ELEMENT nombre_trabajador (#PCDATA)>
<!ELEMENT fecha_pedido (#PCDATA)>
<!ELEMENT observaciones (#PCDATA)>
<!ELEMENT plazo_revision (#PCDATA)>
<!ELEMENT codigo_articulo (#PCDATA)>
<!ELEMENT unidades (#PCDATA)>
<!ELEMENT precio_unidad (#PCDATA) >
<!ELEMENT observaciones_articulo (#PCDATA)>
]>

<pedidos>
        <pedido>
                <cod_pedido></cod_pedido>
                <sucursal></sucursal>
                <direccion></direccion>
                <nombre_trabajador></nombre_trabajador>
                <fecha_pedido></fecha_pedido>
                <observaciones></observaciones>
                <plazo_revision></plazo_revision>
                <codigo_articulo></codigo_articulo>
                <unidades></unidades>
                <precio_unidad></precio_unidad>
                <observaciones_articulo></observaciones_articulo>
        </pedido>
</pedidos>

 

 

3.- VALIDAR XML + DTD

En el ejemplo anterior, hemos visto que el dtd está incluido en el propio XML, pero muchas veces lo que nos interesa es tener un dtd externo y poder así vincularlo desde multitud de ficheros XML. El proceso de validación es exactamente igual al realizado en el paso anterior:

Abrimos nuestro fichero XML donde podemos ver en el DOCTYPE que lo asociamos a un dtd llamado dtd.dtd dentro de su mismo directorio. Haremos click en el check azul par comprobar si el XML está bien formado:

XML Copy EditorFichero XML bien formado

 

Para validar tanto a nivel de sintaxis como validad si cumple el XML con nuestro DTD, haremos click en el check verde:

XML Copy EditorError en validación

 

 

En el asco anterior, vemos que nos ha dado un error de validación. Lo que sucede es que, si asociamos un dtd externo, no puede haber espacios entre las etiquetas. Por tanto, si eliminamos los espacios y volvemos a validar, el error desaparecerá:

XML Copy EditorValidación XML corregida

 

El código del XML del ejemplo es:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
  Autor: Raúl Prieto Fernández
-->
<!DOCTYPE pedidos SYSTEM "dtd.dtd">

<pedidos>
        <pedido>
                <cod_pedido></cod_pedido>
                <sucursal></sucursal>
                <direccion></direccion>
                <nombre_trabajador></nombre_trabajador>
                <fecha_pedido></fecha_pedido>
                <observaciones></observaciones>
                <plazo_revision></plazo_revision>
                <codigo_articulo></codigo_articulo>
                <unidades></unidades>
                <precio_unidad></precio_unidad>
                <observaciones_articulo></observaciones_articulo>
        </pedido>
</pedidos>

 

El código del DTD del ejemplo es:

<!ELEMENT pedidos (pedido)*>
<!ELEMENT pedido (cod_pedido|sucursal|direccion|nombre_trabajador|fecha_pedido|observaciones|plazo_revision|codigo_articulo|unidades|precio_unidad|observaciones_articulo)*>
<!ELEMENT cod_pedido (#PCDATA)>
<!ELEMENT sucursal (#PCDATA)>
<!ELEMENT direccion (#PCDATA)>
<!ELEMENT nombre_trabajador (#PCDATA)>
<!ELEMENT fecha_pedido (#PCDATA)>
<!ELEMENT observaciones (#PCDATA)>
<!ELEMENT plazo_revision (#PCDATA)>
<!ELEMENT codigo_articulo (#PCDATA)>
<!ELEMENT unidades (#PCDATA)>
<!ELEMENT precio_unidad (#PCDATA) >
<!ELEMENT observaciones_articulo (#PCDATA)>

 

 

4.- VALIDAR XML + DTD + SCHEMA

Para validar un XML, con su DTD y con su SCHEMA, primero es necsario asociar el esquema al XML desde las opciones del menú MXL -> Asociar -> XML Schema y seleccionaremos el esquema.

XML Copy EditorAsociar SCHEMA

 

 

Para comprobar si está bien formado el XML, haremos click en el check azul:

XML Copy EditorXML bien formado

 

 

Para validar el fichero con su correspondiente dtd y SCHEMA, haremos click en el check verde:

XML Copy EditorValidando XML+DTD+SCHEMA

 

 

Se puede ver que los datos introducidos no siguen el patrón esperado pro el esquema definido. En nuestro caso hemos introducido el valor "1AA-123" cuando el esquema espera LETRA-LETRA-LETRA-NÚMERO-NÚMERO-NÚMERO:

XML Copy EditorEjemplo del SCHEMA

 

 

El código del fichero XML del ejemplo es:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
  Autor: Raúl Prieto Fernández
-->
<!DOCTYPE pedidos SYSTEM "dtd.dtd">

<pedidos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
        <pedido>
                <cod_pedido>a1234567</cod_pedido>
                <sucursal>123213213</sucursal>
                <direccion>213213213</direccion>
                <nombre_trabajador>213213213213</nombre_trabajador>
                <fecha_pedido>2014-01-01</fecha_pedido>
                <observaciones>Urgente</observaciones>
                <plazo_revision>365</plazo_revision>
                <codigo_articulo>1AA-123</codigo_articulo>
                <unidades>10</unidades>
                <precio_unidad>100</precio_unidad>
                <observaciones_articulo></observaciones_articulo>
        </pedido>
</pedidos>

 

 

El código del fichero DTD del ejemplo es:

<!ELEMENT pedidos (pedido)*>
<!ELEMENT pedido (cod_pedido|sucursal|direccion|nombre_trabajador|fecha_pedido|observaciones|plazo_revision|codigo_articulo|unidades|precio_unidad|observaciones_articulo)*>
<!ELEMENT cod_pedido (#PCDATA)>
<!ELEMENT sucursal (#PCDATA)>
<!ELEMENT direccion (#PCDATA)>
<!ELEMENT nombre_trabajador (#PCDATA)>
<!ELEMENT fecha_pedido (#PCDATA)>
<!ELEMENT observaciones (#PCDATA)>
<!ELEMENT plazo_revision (#PCDATA)>
<!ELEMENT codigo_articulo (#PCDATA)>
<!ELEMENT unidades (#PCDATA)>
<!ELEMENT precio_unidad (#PCDATA) >
<!ELEMENT observaciones_articulo (#PCDATA)>

 

 

El código del fichero XSD (SCHEMA) del ejemplo es:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="pedidos">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="pedido"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="pedido">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="cod_pedido">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="[a-zA-Z]{1}[0-9]{7}"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="sucursal">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:maxLength value="255"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="direccion">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:maxLength value="255"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="nombre_trabajador">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:maxLength value="128"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="fecha_pedido" type="xs:date"/>
        <xs:element name="observaciones">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="Urgente|Incompleto"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="plazo_revision">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:pattern value="[0-9][0-9][0-9]"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="codigo_articulo">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="[A-Z][A-Z][A-Z][\-][0-9][0-9][0-9]"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="unidades">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="1"/>
              <xs:maxInclusive value="1000"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="precio_unidad">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="0"/>
              <xs:maxInclusive value="10000"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="observaciones_articulo" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

 

ENJOY!

 


Raúl Prieto Fernández

Sitio Web: www.raulprietofernandez.net

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

Escribir un comentario

Código de seguridad
Refescar

Acerca de mi

Soy Ingeniero Téc. Industrial Mecánico y Administrador de Sistemas Informáticos.

Contactar conmigo

Dirección: León, España
E-Mail: raul.lnx@gmail.com
Web: http://www.raulprietofernandez.net
Skype: raul.lnx



Follow Me - Instagram

Apúntate Gratis

Entra en la Comunidad VIP y consigue acceso a las descargas en PDF, Trucos y Videotutoriales ocultos y mucho más....

¡Muy Pronto!