Validar documentos XML es sumamente sencillo. Existen muchas formas y herramientas para su validación, todas muy similares pero con el mismo concepto.
Si queréis aprender como hacer una validación desde Windows, seguid leyendo...
Validar documentos XML es sumamente sencillo. Existen muchas formas y herramientas para su validación, todas muy similares pero con el mismo concepto.
Si queréis aprender como hacer una validación desde Windows, seguid leyendo...
⬇️ Compra en Amazon el hardware que utilizo ⬇️
¿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
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.
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.
Pantalla principal XML Copy Editor
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:
Comprobar 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:
Validació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>
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:
Fichero 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:
Error 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á:
Validació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)>
Para validar un XML, con su DTD y con su SCHEMA, primero es necesario asociar el esquema al XML desde las opciones del menú MXL -> Asociar -> XML Schema y seleccionaremos el esquema.
Asociar SCHEMA
Para comprobar si está bien formado el XML, haremos click en el check azul:
XML bien formado
Para validar el fichero con su correspondiente dtd y SCHEMA, haremos click en el check verde:
Validando XML+DTD+SCHEMA
Se puede ver que los datos introducidos no siguen el patrón esperado por 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:
Ejemplo 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!