Para que un documento este bien formado tiene que cumplir estrictamente las siguientes normas.
- Los elementos tienen que estar estructurados de una forma jerárquica. Todos los elemento deben tener un “padre”, exceptuando el elemento raíz.
- Los documentos deben de estar tabulados, de tal forma que sea fácil de reconocer los elementos antes del procesado.
- Todos los elementos deben contener su etiqueta de inicio y de cierre.
- Solo puede existir un elemento raíz.
- Al igual que ocurre con las variables, el nombre de los elementos debe empezar siempre con un carácter no numérico.
- XML es un lenguaje case sensitive(sensible a mayúsculas y minúsculas). No es lo mismo la etiqueta <EtiQueta> que la etiqueta <eTiqueTa>.
- 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
|
1 2 3 4 5 6 7 8 9 |
<?xml: version=“1.0”?> <base_datos nombre=“Empresa”, tipo=“IBM”, propietario=“usuario”> <tabla nombre=“Sucursales”, propietario=“ usuario”> <columna nombre=“nSucursal”, tipo=“Integer”> </columna> </tabla > </base_datos> <autor nombre=“jdedef”> </autor> |
Este documento está mal formado porque existen dos elementos raíz y no respeta las tabulaciones.
|
1 2 3 4 5 6 7 |
<?xml: version=“1.0”?> <base_datos nombre=“Empresa”, tipo=“IBM”, propietario=“ usuario”> <tabla nombre=“Sucursales”, propietario=“ usuario”> <columna nombre=“nSucursal”, tipo=“Integer”> </tabla> </base_Datos> </coluMNa> |
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»>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE ligaDeFutbol [ <!ELEMENT ligaDeFutbol (partido*)> <!ELEMENT partido EMPTY> <!ATTLIST partido localNombre CDATA #REQUIRED> <!ATTLIST partido localGoles CDATA #REQUIRED> <!ATTLIST partido visitanteNombre CDATA #REQUIRED> <!ATTLIST partido visitanteGoles CDATA #REQUIRED> ]> <ligaDeFutbol> <partido localNombre=”R. MADRID” localGoles=”1” visitanteNombre=”Inter de Mitente” visitanteGoles=”1” /> <partido localNombre=”Valencia” localGoles=”3” visitanteNombre=”Sparta da Risa” visitanteGoles=”3” /> <partido localNombre=”Water de Munich” localGoles=”4” visitanteNombre=”Esteaua es del grifo” visitanteGoles=”2” /> </ligaDeFutbol> |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0"?> <!DOCTYPE mensaje [ <!ELEMENT mensaje (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> < mensaje > <to>Roberto</to> <from>Nuria</from> <heading>Importante anuncio</heading> <body>Cuando vengas en coche, no te olvides de cumplir todas las normas de circulación</body> </ mensaje > |
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:

|
1 2 3 4 5 6 |
<!ATTLIST curso director CDATA #REQUIRED horario (mañana | tarde | noche) #IMPLIED instalaciones (Exes | externas) “Exes”> |
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>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE frutas [ <!ELEMENT frutas (fruta)*> <!ELEMENT fruta EMPTY> <!ATTLIST fruta foto ENTITY #REQUIRED> <!ENTITY manzana SYSTEM "manzana.gif" NDATA gif> <!ENTITY naranja SYSTEM "naranja.gif" NDATA gif> <!NOTATION gif SYSTEM "image/gif"> ]> <frutas> <fruta foto="manzana"/> <fruta foto="naranja"/> </frutas> |
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
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> |
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.
|
1 2 3 |
<xs:attribute name="nombre_atributo" type="tipo" use="required" default="valor"/> <xs:attribute name="nombre_atributo" type="tipo" fixed="valor"/> |
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:
|
1 2 3 4 5 6 7 8 9 10 |
<xs:restriction base="xs:string"> <xs:length value=" numero de caracteres"/> </xs:restriction> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> <xs:restriction base="xs:integer"> <xs:minInclusive value="valor_maximo"/> <xs:maxInclusive value="valor minimo"/> </xs:restriction> |
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>