Documentos validos y bien formados

Para que un documento este bien formado tiene que cumplir estrictamente las siguientes normas.

  1. Los elementos tienen que estar estructurados de una forma jerárquica. Todos los elemento deben tener un “padre”, exceptuando el elemento raíz.
  2. Los documentos deben de estar tabulados, de tal forma que sea fácil de reconocer los elementos antes del procesado.
  3. Todos los elementos deben contener su etiqueta de inicio y de cierre.
  4. Solo puede existir un elemento raíz.
  5. Al igual que ocurre con las variables, el nombre de los elementos debe empezar siempre con un carácter no numérico.
  6. XML es un lenguaje case sensitive(sensible a mayúsculas y minúsculas). No es lo mismo la etiqueta <EtiQueta> que la etiqueta <eTiqueTa>.
  7. Para insertar palabras claves de XML o caracteres como como, &, <>,»». Debemos usar las estructuras indicadas a tal efecto.

Documento válido

Según la especificación XML publicada en W3C se establece que al procesar un XML debe producirse un error si no cumple con las normas sintácticas de XML. La única excepción sería un documento HTML que se procesara hasta el final aunque tenga errores.

Un documento XML es válido si está bien formado y además cumple las reglas establecidas en su DTD o en cualquier otro elemento de validación.

Existe diferentes métodos para validar un documento XML, algunos de ellos son:

  • DTD: Etiquetas con las reglas que debe cumplir el documento XML.
  • Schema: más avanzado que la DTD y permite especificar la estructura y contenidos del documento.
  • Relax NG: es un lenguaje de esquema basado en la gramática.
  • Schematron: utiliza expresiones de acceso.

Existen herramientas mediante las que podemos verificar si un XML es valido, algunas de ellas son:

Validador XML

Editor web para validar XML. https://www.w3schools.com/xml/xml_validator.asp

Validador HTML

Editor web para validar HTML. http://validator.w3.org/

Ejemplo de documentos mal formados

Este documento está mal formado porque existen dos elementos raíz y no respeta las tabulaciones.

Es un documento mal formado porque no respeta el anidamiento ni las mayúsculas y minúsculas.

Herramientas de edición

Para crear documentos XML y HTML nos vale cualquier editor de texto plano, pero resultan de gran ayuda herramientas que revisen la sintaxis mientras se escribe el documento.

La mayoría de los IDE´s de desarrollo incluyen estas ayudas, aunque también existen editores que tienen como único objetivo la asistencia en la creación de documentos XML.

Las funciones mínimas que debería tener un editor de XML son:

  • Interpretar los DTD asociados al documento y asistirnos en la elaboración de los documentos, mostrándonos los elementos disponibles.
  • Revisar la sintaxis del documento, comprobando que las etiquetas estén bien cerradas y en orden correcto.

Algunos editores especifocos para XML son:

  • XML Pro (open source).
  • XMLSpy
  • Liquid XML Studio
  • <oXigen/> XML Editor.
  • Turbo XML
  • XML Notepad
  • XMLwriter

Definición de tipo de documento (DTD)

 DTD

Como ya hemos comentado un DTD es un conjunto de reglas sintácticas para definir las etiquetas del documento. En el nos restringe qué etiquetas se pueden usar , el orden que deben tener en su aparición y cual esta dentro de otra, además de los atributos que tienen, etc.

No es obligatorio que un XML tenga un DTD. En muchas ocaciones creamos XML para almacenar la información de un elemento, y lo controlamos desde los lenguajes de programación. Pero cuando un XML va a ser usado por varias aplicaciones o es público, resulta muy aconsejable que posea un DTD para garantizar el buen funcionamiento del mismo.

Gracias al DTD definimos:

•        Elementos: cuáles son las etiquetas permitidas y que contienen.

•        Estructura: en qué orden van las etiquetas.

•        Anidamiento: la jerarquía del árbol de las etiquetas o nodos.

 

 Sintaxis

Los documentos XML deben comenzar por la instrucción de procesamiento que le indica al procesador XML el tipo de normalización usado y la codificación de caracteres.

<?XML version=»1.0″encoding=»UTF-8″?>

Una vez definido que se trata de un documento XML, se debe colocar el DTD, este puede estar incluido en el mismo documento, por lo que pondremos las definiciones dentro de la etiqueta DOCTYPE, como se muestra a continuación:

<! DOCTYPE[

   definiciones

]>

Si lo que deseamos es tener el DTD en un documento externo asociado al XML, pondremos en el documento la misma etiqueta DOCTYPE, pero añadiendo SYSTEM y la ruta donde se encuentra el archivo con las definiciones DTD, este archivo suele tener la extensión “.dtd”.

<! DOCTYPE etiqueta SYSTEM «documento.dtd»>

Existe otra variación, cuando además de querer que este en un documento externo, deseamos que el XML sea público, es decir, otras aplicaciones ajenas a nuetro dominio van a acceder a su información. Esta es remplazar SYSTEM por PUBLIC.

<! DOCTYPE etiqueta PUBLIC «documento.dtd»>

Elementos

Con la etiqueta <!ELEMENT …> definimos los elementos que tendrá nuestro documento.

Ejemplo: <!ELEMENT tag (tag1, tag2)>

En el ejemplo, podemos ver como primero incluimos el nombre de la etiqueta que debe estar en el documento (tag), y entre paréntesis los hijos que contendrá (tag1 y tag2).

En el ejemplo mostrado estamos indicando una etiqueta y sus hijos, que quedaría de deste modo:

<tag>

            <tag1>…</tag1>

            <tag2>…</tag2>

</tag>

De este modo, Podemos definir toda la estructura de nodos que tendrá nuestro documento, indicando a cada padre las etiquetas hijas que tendrá, pero podemos definir además si es posible que tenga un hijo u otro, si tendrá uno solo, mas de uno, etc. Para ello usaremos los símbolos “|, +, *”.

Ejemplo: <!ELEMENT tag (tag1 | tag2, tag3 +, tag4 *)>

No solo podemos definir las etiquetas que contendrá un nodo, sino que además si se trata de contenido podremos definir que contienen. Para los elementos que están vacíos usaremos ( Empty ),para indicar cualquier tipo de contenido tenemos ( Any ) o solo si se trata de datos ( [#PCDATA] ).

Ejemplos:

        <!ELEMENT texto #PCDATA>

        <!ELEMENT salto EMPTY>

        <!ELEMENT extra ANY>

        <!ELEMENT elemento (#PCDATA, elemento1)>

También se permite el uso de elementos mixtos.

En este ejemplo podemos ver como el DTD define que el documento tendrá un nodo “mensaje”, que tendrá como hijos a to, from, heading y body. Además indicamos que dada uno de los hijos tendrán datos al poner  (#PCDATA).

Si cuando procesemos el documento, alguna de estas normas no se cumple, nos devolvería un error indicando que los datos no son validos.

Si quieres ver más ejemplos de aplicación de ELEMENT. https://www.w3schools.com/xml/xml_dtd_elements.asp

Atributos

Mediante la etiqueta <!ATTLIST…> definiremos los atributos de un elemento (nodo) determinado, el funciomaniento de las reglas es similar al que realizamos con ELEMENT, pero con la diferencia de que no tiene hijos, por lo que se centra en el contenido de los datos que tiene.

<!ATTLIST nodo NomAtributo Tipo Valpredeterminado>

Para definir el tipo del atributo que contendrá el elemento tenemos:

En el ejemplo podemos ver como definimos los atributos que contendrá las etiquetas curso, horario e instalaciones de un documento, con sus opciones correspondientes.

 

Si quiere ver más ejemplos de ATTLIST. https://www.w3schools.com/xml/xml_dtd_attributes.asp

Entidades

Mediante las entidades podemos, definir el contenido que tendrá una etiqueta, independiente mente del XML, esto resulta útil cuando queremos que determinadas etiquetas tengan un contenido específico, como una imagen, una referencia etc.

Imaginemos que todos los XML creados por nuestra empresa, incluya el nombre o la página web, sin que tengamos que ponerla en cada nuevo documento que creemos, para ello crearemos una entidad, que nos definirá ese contenido.

Ejemplo:

 <!ENTITY empresa «Manzanas Alonso S.L»>

<!ENTITY web «www.manzanasalonso.com»>

Entidades internas

Estas son con las que incluimos contenido que podamos especificar en el mismo documento.

Asocian a una cadena de caracteres y se referencian únicamente desde el propio fichero, de ahí su nombre, internas.

<!ENTITY tag «Jaun Perez»>

 

Entidades externas y parámetros

Las entidades externas tienen la misma función que las internas, pero en este caso el el contenido esta fuera del documento,  como un archivo, pudiendo ser incluso imágenes, archivos de sonido, videos, etc.

Para indicar la ruta del recurso externo se usa la palabra SYSTEM.

 <!ENTITY entity-name SYSTEM «URI/URL»>

En el caso de los parámetros solo podemos referenciarlos en la DTD del documento. Se utiliza % antes del nombre para referenciar y se definen de la forma:

<!ENTITY %parametro  «texto»>

 Si quieres ampliar la información sobre !ENTITY. https://www.w3schools.com/xml/xml_dtd_entities.asp

Notaciones

Este tipo de atributo permite al autor declarar que su valor se ajusta a una notación declarada.

<!NOTATION nombre SYSTEM «notación»>

<!ATTLIST mensaje fecha NOTATION (ISO-DATE | EUROPEAN-DATE) #REQUIRED>

Modelo de documento XML schema

XML Schema

Los esquemas son mas estrictos a la hora de definir un documento XML que los DTD, por ejemplo en el caso de los esquemas podemos definit el tipo de dato que tendrá un nodo, lo cual lo hace mucho más útil  en el intercambio de datos, objetos o bases de datos.

Schema es un estándar recomendado por el W3C (Word Wide Web Consortium) al igual que los DTD.

Un esquema establece las reglas que debe seguir un documento XML indicando las etiquetas que se pueden usar, los atributos, sus relaciones entre etiquetas, etc.

Ejemplo

En el ejemplo anterior, Podemos ver como mediante un Schema no solo se define la estructura que tendrá el documento, sino que Tambien el tipo de dato que tendrá cada nodo.

Definición

Como hacíamos con los DTD, el primer paso es definir el documento para ello, lo hacemos con una serie de atributos.

<xmlns:xs=http://www.w3.org/2001/XMLSchema>

Para referenciar el documento usaremos los atributos xmlns:xsi y para indicar la ubicación del archivo usaremos xsi:schemalocation.

<xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=“c:/archivo.xsd”>

 Elementos simples

Un elemento simple es el que define el nombre de la etiqueta y el tipo de datos.

<xs:element  name=”nombre_elemento” type=”tipo_datos”/>

Cuando se define un elemento en Schema es imprescindible indicar el tipo de datos que contiene. Existen varios tipos de datos que podemos incluir, siendo los mas comunes:

  • xs:string
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

El elemento puede incluir atributos o restricciones. Si no incluyera ninguna de estas utilizaríamos la forma de sintaxis abreviada que hemos visto; abre con «<» y cierra al final de la

línea con «/>.»

Si tuviera alguno de estos elementos se debe definir una nueva etiqueta, indicando que el elemento es simple:

<xs:element name=”nombre_elemento”>

    <xs:simpleType>

Atributos y restricciones

Para definir atributos utilizaremos una sintaxis similar a la de los elementos.

<xs:attribute name=»nombre_atributo» type=»tipo»/>

Se pueden poner valores por defecto y fijos con los atributos fixed y default, así como elegir si es requerido o no con el atributo use.

En cuanto a las restricciones, existen gran número de restricciones que se indican con una etiqueta. Las más utilizadas son la de valor máximo y mínimo, la longitud del campo de datos, o la elección entre una lista de valores de atributo:

Para ver ejemplos de aplicación de los Schemas. https://www.w3schools.com/xml/schema_intro.asp

Espacios de nombres en XML

Un espacio de nombres es la forma de poder proporcionar a elementos y atributos con el mismo vocablo, entidades diferentes.

En ocasiones un documento puede contener elementos con el mismo nombre  pero que contengan contenido diferenciado. Si queremos diferenciar cada uno de ellos se llevaran a espacios de nombres distintos que los diferenciaran.

Esto solo puede suceder si se están obteniendo las reglas desde diferentes fuentes, por lo que pondremos un “prefijo” a cada fuente para poder indicar cual es cual, y su significado

Pongamos un ejemplo en el que tenemos proveedores y clientes, clarameten ambos tendrán etiquetas con el mismo nombre, así que definiremos las fuentes:

<cli:cliente xmlns:cli=’Espacio_de_nombres_XML/cliente’             xmlns:prov=’Espacio_de_nombres_XML/pedido’>

Y luego podremos definir cada tipo según el prefijo

<cli:nombre>Antonio Martinez</cli:nombre>

<cli:telefono>91000000</cli:telefono>

<prov:nombre>Frutas Lopez</prov:nombre>

<prov:telefono>91000000</prov:telefono>