XML
Autor: Carlos Ollero Sánchez
1. XML
2. DTD
3. XML Schema
4. XSLT
Definición de XML
XML (eXtensible Markup Language, Lenguaje de Marcado eXtensible) es un lenguaje desarrollado por
W3C (World Wide Web Consortium), basado en SGML (Standard Generalized Markup Language,
Lenguaje de Marcado Generalizado Estándar).
XML se utiliza para el almacenamiento e intercambio de datos estructurados entre distintas
plataformas. XML es un metalenguaje y sirve para definir otros lenguajes. Por ejemplo: XHTML.
Ejemplo de documento XML
<?xml version="1.0" encoding="UTF-8"?>
<alumnos>
<alumno>
<nombre>Ana</nombre>
<apellido1>López</apellido1>
<apellido2>López</apellido2>
</alumno>
<alumno>
<nombre>Pedro</nombre>
<apellido1>Sánchez</apellido1>
<apellido2>blanco</apellido2>
</alumno>
</alumnos>
Reglas XML
1. XML es Case Sensitive.
2. Es obligatorio un elemento raíz que contenga el resto de etiquetas (alumnos en el
ej.).
3. Se suelen utilizar sólo minúsculas.
4. Las etiquetas empiezan por caracteres alfabéticos o por _. No pueden empezar
por números pero sí contenerlos.
5. Toda etiqueta debe tener apertura y cierre.
6. Anidamiento perfecto entre elementos.
7. Los valores de los atributos van siempre entre comillas.
8. No puede haber un salto de línea antes del nombre de la etiqueta.
Documento XML bien formado
Se dice que está bien formado cuando:
- Cumple todas las reglas anteriores.
- Hay una única etiqueta raíz.
- Además será válido si cumple con las especificaciones declaradas en su plantilla
(DTD o XML Schema)
Partes de un documento XML. 1
Declaración XML:
version
Obligatorio a no ser que este ya incluido en otro documento.
encoding
Opcional. Es la codificación de caracteres con la que se ha guardado el documento.
standalone
Opcional. Indica si un documento va acompañado de un DTD o no lo necesita (si no tiene DTD
asociado, standalone valdrá yes)
<?xml version=”1.0” encoding=”UTF-8” standalone=”yes” ?>
Partes de un documento XML. 2
Declaración de DTD (opcional):
<!DOCTYPE informacion [
<!ELEMENT informacion (software+, modulo+)>
<!ATTLIST informacion curso CDATA #FIXED "1">
<!ELEMENT software (nome, dataPubli)>
<!ATTLIST software codigo (gratuito|comercial) #IMPLIED>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT dataPubli (#PCDATA)>
<!ATTLIST dataPubli ano CDATA "2015">
<!ELEMENT modulo (#PCDATA)>
<!ATTLIST modulo titulo CDATA #IMPLIED>
]>
Partes de un documento XML. 3
Documento o nodo raíz:
Todos los elementos de un documento XML estarán contenidos entre las etiquetas de apertura y cierre del nodo raíz, cuelgan del nodo padre
que contiene a todos los demás en una estructura de árbol.
Habrá sub-elementos hijo que contendrán todos los elementos con sus datos y atributos.
Por último tendremos el cierre de la etiqueta de cierre del nodo raíz.
<nodoRaiz>
<elemento1>ljlkjklj</elemento1>
<elemento2 atributo1=”atr1” atributo2=”atr2”>lwqerwew</elemento2>
....
</nodoRaiz>
<?xml version="1.0" encoding="UTF-8"?>
Ejemplo de <!DOCTYPE informacion SYSTEM "[Link]">
<informacion>
<software codigo="N1" tipo="gratuito">
documento <nome>Notepad++</nome>
<dataPubli ano="2015" mes="marzo"/>
</software>
XML
<software codigo="X1">
<nome>XML Copy Editor</nome>
<dataPubli ano="2012" mes="maio"/>
</software>
<software codigo="M1" tipo="comercial">
<nome>Microsoft Word</nome>
</software>
<software codigo="P1">
<nome>PacketTracer</nome>
<dataPubli ano="2016" mes="enero"/>
</software>
<modulo usa="N1 X1">
<titulo>Linguaxe de Marcas</titulo>
</modulo>
<modulo usa="P1">
<titulo>Redes</titulo>
</modulo>
<modulo>
<titulo>FOL</titulo>
</modulo>
</informacion>
Contenido de los elementos XML
Un elemento puede contener:
● Nada (elemento vacío).
● Datos.
● Subelementos XML.
● Atributos: aportan información que no forma parte de los datos.
Puede haber varias opciones mezcladas.
En el ejemplo siguiente, el elemento <libro> contiene dos elementos: <producto> y <capitulo>.
El elemento <producto> es un elemento vacío, porque no contiene ningún dato pero tiene dos atributos
id y medio.
El ejemplo sería:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<libro>
<titulo>El mundo de XML</titulo>
<producto id="33-657" medio="papel"></producto>
<capitulo>Introduccion a XML
<par>Que es html</par>
<par>Que es xml</par>
</capitulo>
</libro>
DTD (Document Type Definition)
Es el conjunto de reglas sintácticas que definen las etiquetas. Nos permiten crear
nuestro propio lenguaje de marcas.
1. Nos define qué etiquetas son válidas.
2. En qué orden pueden aparecer.
3. Cual es la jerarquía entre ellas.
4. Cuales son sus atributos y cuáles son sus valores permitidos.
5. Se puede colocar dentro del mismo documento XML o en un fichero externo.
DTD: declaración
Hay tres formas de declarar la DTD:
1. Insertada en el documento XML.
<!DOCTYPE informacion [
<!ELEMENT informacion (software+, modulo+)>
<!ATTLIST informacion curso CDATA #FIXED "1">
<!ELEMENT software (nome, dataPubli)>
<!ATTLIST software codigo (gratuito|comercial) #IMPLIED>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT dataPubli (#PCDATA)>
<!ATTLIST dataPubli ano CDATA "2015">
<!ELEMENT modulo (#PCDATA)>
<!ATTLIST modulo titulo CDATA #IMPLIED>
]>
2. Enlazando a un documento externo: <!DOCTYPE Libros SYSTEM "[Link]">
3. Enlazando a una DTD pública: <!DOCTYPE nodo_raiz PUBLIC "-//OASIS//DTD Libro XML//EN"
"../dtds/[Link]">
DTD: definición de elementos
Se especifican así:
<!ELEMENT nombreElemento tipoElemento> // Elemento simple.
<!ELEMENT nombreElemento (sub-elementos)> // Elemento compuesto.
Si los subelementos van separados por , se exige que sigan ese mismo orden. Si van separados por | pueden
aparecer en cualquier posición.
Se pueden indicar las siguientes reglas:
● Si un elemento aparece o no de forma opcional (usando ?).
● Si un elemento debe aparecer de forma obligatoria.
● Si aparece una o muchas veces (usando +).
● Si aparece cero o muchas veces (usando *).
● Si un elemento no lleva nada dentro usando <!ELEMENT cantidad (#PCDATA) .
● Se puede indicar que un elemento cantidad lleva obligatoriamente un atributo divisa usando <!ATTLIST cantidad
divisa CDATA #REQUIRED
● Se puede indicar que un elemento cantidad podría llevar o no obligatoriamente un atributo moneda usando <!
ATTLIST cantidad moneda CDATA #IMPLIED
Ejemplos de definición de elementos
1. Si van separados por comas exigen que sigan exactamente ese orden: <!ELEMENT libro (titulo,
autor, capitulo)>
2. Si lo que nosotros necesitamos es que siempre aparezca uno de cada pero en diferente orden,
pondríamos: <!ELEMENT libro (titulo | autor | capitulo)+ >
3. Incluso podríamos especificar subelementos: <!ELEMENT libro (titulo, autor, (fotografia|dibujo),
capitulo)+ >
4. El tipo menos restrictivo es ANY. Permite cualquier contenido. Se debe evitar: <!ELEMENT cualquiera
ANY>
5. Para datos de tipo texto, se usa #PCDATA, puede estar vacío pero no contener gráficos ni elementos
multimedia: <!ELEMENT texto (#PCDATA)>
6. Para elementos vacíos, se usa EMPTY. Sólo tiene información en sus atributos. <!ELEMENT img EMPTY>
7. Pueden utilizarse en el documento XML de dos formas: <img src="[Link]"></img> y con dos
etiquetas, o solo con una: <img src="[Link]" />
Definición de atributos
Los atributos permitidos se especifican con ATTLIST y el nombre del elemento seguido de los nombres de
los atributos, con un tipo y modificador obligatorios.
<!ATTLIST nombre_elemento nombre_atributo tipo_atributo modificador>
Los tipos de definiciones de atributos que podemos usar son:
- Tipo estándar, para cualquier valor, o una enumeración de los valores permitidos.
<!ATTLIST libro ISBN CDATA #REQUIRED>
En este ejemplo se define un atributo llamado ISBN para el elemento libro, siendo obligatorio este
atributo.
- Valores enumerados.
<!ATTLIST libro portada (foto | dibujo) #REQUIRED>
En este ejemplo se define para el elemento Libro el atributo portada, es obligatorio y tiene dos
posibles valores.
- Definición de varios atributos en una sola instrucción.
<!ATTLIST autor nacionalidad CDATA #IMPLIED sexo (hombre | mujer) "mujer">
Tipos de datos de los atributos
CDATA: Cualquier valor, o una enumeración de los valores permitidos.
NMTOKEN: Para restringir el valor a un nombre XML válido (es decir, que empiece con una letra o guión de subrayado y
contenga solo letras, números, guiones de subrayado, guiones y puntos sin espacios)
NMTOKENS: Múltiples atributos NMTOKEN.
ID: Además de las restricciones que impone NMTOKEN, impone que el valor sea único en todo el documento.
<!ATTLIST libro id ID #REQUIRED>
IDREF: Una referencia a un ID declarado en alguna parte del DTD.
<!ATTLIST libro referencia IDREF #REQUIRED>
IDREFS: Múltiples IDREF.
ENTITY: Entidad binaria externa. (Hace referencia a un bloque de datos ya especificado).
ENTITIES: Múltiples ENTITY separadas con espacios.
NOTATION: Notación declarada en otra parte del DTD.
El modificador puede ser:
#REQUIRED: Para atributos obligatorios.
<!ATTLIST libro ISBN CDATA #REQUIRED>
#IMPLIED: Para atributos opcionales.
<!ATTLIST libro ISBN CDATA #IMPLIED>
#FIXED: Para atributos con valores fijos.
<!ATTLIST libro ISBN CDATA #FIXED>
También puede ser un valor por defecto:
<!ATTLIST autor sexo (hombre | mujer) "mujer">
Ejercicios DTD. 1
Unos programadores necesitan un formato de fichero para que sus distintos programas
intercambien información sobre ventas. El acuerdo al que han llegado es que su XML debería
tener esta estructura:
● El elemento raíz será <listaventas>
● Toda <listaventas> tiene una o más ventas.
● Toda <venta> tiene los siguientes datos:
○ Importe.
○ Comprador.
○ Vendedor.
○ Fecha (optativa).
○ Un código de factura.
Ejercicios DTD. 2
Se desea crear una gramática para ficheros de datos en los que se ha decidido contemplar lo
siguiente:
● El fichero debe llevar una raíz <productos>
● Dentro debe haber uno o más elementos <producto>
● Dentro de productos debe haber alguno de estos <producto> , <raton> , <teclado> o
<monitor>
● Todo ratón, teclado o monitor tiene siempre un código.
● Todo ratón, teclado o monitor puede llevar un nombre.
● Todo ratón, teclado o monitor puede llevar una descripción.
Ejercicios DTD. 3
En un departamento se ha decidido la siguiente estructura para ficheros de datos que se tengan que mover de
unos software a otros.
● La raíz debe ser el elemento <listacompras>
● Dentro de <listacompras> debe haber uno o más elementos <venta>
● Una venta puede llevar dentro uno de dos: <ventaacredito> o <ventainmediata>
● Un elemento <ventaacredito> consta de : un elemento <fechafinpago> que es optativo y un elemento
<cantidad> que es obligatorio.
● Un elemento <ventainmediata> lleva dentro dos cosas: un elemento <cantidad> que es obligatorio y un
elemento <divisa> que también es obligatorio.
Ejercicios DTD. 4
Unos programadores necesitan estructurar la información que intercambiarán los ficheros de sus
aplicaciones para lo cual han determinado los requisitos siguientes.
● Los ficheros deben tener un elemento <listafacturas>
● Dentro de la lista debe haber una o más facturas.
● Las facturas tienen un atributo fecha que es optativo.
● Toda factura tiene un emisor, que es un elemento obligatorio y que debe tener un atributo cif
que es obligatorio. Dentro de emisor debe haber un elemento nombre, que es obligatorio y
puede o no haber un elemento volumenventas.
● Toda factura debe tener un elemento pagador, el cual tiene exactamente la misma estructura
que emisor.
● Toda factura tiene un elemento importe.
XML Schema
También llamado XSD es un lenguaje que sirve para definir la estructura de un
documento XML. Es una evolución considerable de las DTD.
1. Fue desarrollado por la W3C.
2. Se basa en XML.
3. Permite el uso de espacios de nombres.
4. Soporta tipos en los atributos.
XML Schema
Como documento XML que es tiene un nodo raíz
<xs:schema xmlns:xs="[Link]
...
</xs:schema>
Más información
XML Schema
Tipos de elementos
1. Estándar: sin hijos y sin restricciones ni atributos.
2. Simples: sin hijos, tienen restricciones pero no atributos.
3. Complejos: elementos con hijos y/o atributos
Nombre
Alumno
Número Restricciones
Complejo
Clase
Complejo
Profesor 1
Estándar
XML Schema
Estructura de un elemento
1. Vacía:
<xs:element name="nombre_del_elemento" type="tipo" />
2. Con etiqueta de inicio y cierre:
<xs:element name="nombre_del_elemento">
</xs:element>
XML Schema
Estructura de un elemento simple
Puede contener atributos con valores entre comillas
1. name: nombre del elemento.
2. type: tipo simple predefinido.
3. maxOccurs.
4. minOccurs.
5. ref: sirve para importar de otros esquemas o declarado anteriormente.
<xsd:schema xmlns:xsd="[Link]
<xsd:simpleType>
Aquí irán las restricciones, que hemos omitido por ahora.
</xsd:simpleType>
</xsd:schema>
XML Schema
Tipos de datos Primitivos Tipos de datos Derivados
1. string.
1. normalizedString. 13. integer.
2. boolean.
3. decimal. 2. token. 14. nonPositiveInteger.
4. float. 3. language. 15. negativeInteger.
5. double.
4. IDREFS. 16. long.
6. duration.
5. ENTITIES. 17. int.
7. dateTime.
8. time. 18. short.
6. NMTOKEN.
9. date. 19. byte.
7. NMTOKENS.
10. hexbinary. 20. nonNegativeInteger.
11. base64Binary. 8. Name.
21. unsignedLong
12. anyURI. 9. NCName.
13. QName. 22. usignedInt.
10. ID.
14. NOTATION. 23. unsignedShort.
11. IDREF. 24. unsignedByte.
12. ENTITY. 25. positiveInteger.
XML Schema
Ejemplo: Se busca crear un esquema para validar la edad de un alumno de la ESO, el
valor debe estar entre 13 y 18.
<xsd:schema
xmlns:xsd="[Link]
<xsd:element name="edad" type="edadPermitida"/>
<xsd:simpleType name="edadPermitida">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="13"/>
<xsd:maxInclusive value="18"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
ver más ejemplos
XML Schema
Estructura de un elemento complejo
Puede contener los siguientes elementos secundarios:
1. sequence: deben aparecer todos los elementos y en ese orden.
2. all: deben aparecer todos los elementos sin importar el orden.
3. choice: sólo puede aparecer uno de los elementos.
4. attribute: sirve para definir atributos.
Puede contener atributos con valores entre comillas:
5. name.
6. type.
7. mixed: true o false.
XML Schema
1. Se define todo dentro de un element: 2. Se define primero y se usa luego el tipo:
<xs:element name="contacto"> <xs:element name="contacto"
<xs:complexType> type="tipo_contacto"/>
<xs:sequence>
<xs:element name="destinatario" type="xs:string" <xs:complexType name="tipo_contacto">
/> <xs:sequence>
<xs:element name="remitente" <xs:element name="destinatario"
type="xs:string" /> type="xs:string" />
<xs:element name="titulo" type="xs:string" /> <xs:element name="remitente" type="xs:string" />
<xs:element name="contenido" <xs:element name="titulo" type="xs:string" />
type="xs:string" /> <xs:element name="contenido" type="xs:string" />
</xs:sequence> </xs:sequence>
<xs:attribute name="fecha" type="xs:date"/> <xs:attribute name="fecha" type="xs:date"/>
</xs:complexType>
</xs:complexType>
</xs:element>
XML Schema
Restricciones tipo simple: Restricciones tipo complejo:
1. minInclusive - minExclusive. 1. Todas las anteriores.
2. maxInclusive - maxExclusive. 2. sequence.
3. totalDigits: número total de dígitos. 3. choice.
4. fractionDigits: número de cifras
Ejemplo:
decimales.
5. length. <xs:element name="sexo"
type="tipo_sexo"/>
6. minLength - maxLength.
<xs:simpleType name="tipo_sexo">
7. enumeration.
<xs:restriction base="xs:string">
8. pattern.
<xs:enumeration value="mujer"/>
<xs:enumeration value="hombre"/>
</xs:restriction>
</xs:simpleType>
XML Schema. Ejercicio 1
Se necesita tener un esquema que valide un fichero en el que hay un solo elemento llamado codigo
● Dentro de código hay una cadena con una estructura rígida: 2 letras mayúsculas, seguidas de 2 cifras,
seguidas a su vez de 3 letras.
● El elemento código debe llevar un atributo sede que será de tipo cadena.
Solución:
Se piden dos cosas
1. Restringir un tipo básico string.
2. Extender una etiqueta para que tenga un atributo.
Se puede ver la solución en la siguiente página.
XML Schema. Ejercicio 1
<xsd:schema xmlns:xsd="[Link]
<xsd:element name="codigo" type="tipoCodigo"/>
<xsd:simpleType name="tipoCodigoRestringido">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Z]{2}[0-9]{2}[a-Z]{3}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="tipoCodigo">
<xsd:simpleContent>
<xsd:extension base="tipoCodigoRestringido">
<xsd:attribute name="sede"
type="xsd:string"
use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>
XSL
XSL (eXtensible Stylesheet Language, hojas de estilo extensibles) es un lenguaje de
marcas que proporciona opciones de formato y presentación.
Partiendo de un documento XML y aplicando un XSL obtenemos un segundo XML (o
XHTML) con el formato y el aspecto que deseamos. Para ello utiliza un procesador XSLT.
XML XSL XML/
XHTML
XSL
1. Las hojas de estilo XSLT son documentos XML. Empezarán la misma declaración.
2. El elemento raíz será <xsl:stylesheet xmlns:xsl="[Link] version="1.0"> o
<xsl:transform version="1.0" xmlns:xsl="[Link]
3. A continuación irá el elemento <xsl:template match=”/”>. El valor del atributo match hace referencia al elemento raíz, es una
expresión XPath. Por lo que el procesador XSLT recupera el documento original desde su raíz.
4. El elemento <xsl:apply-templates/> hace que el procesador copie el contenido de todos aquellos elementos en el documento
final, que se contienen en el nodo al cual se aplica la plantilla <xsl:template>. Los espacios en blanco, tabulaciones y saltos de
línea entre las etiquetas HTML y el contenido a insertar son eliminados según las reglas XML, ya que no son parte del
contenido.
5. El elemento de alto nivel <xsl:output> indica al procesador el formato en que se generará el resultado: XML, HTML o texto. En
XSLT 2.0 es posible además en XHTML. Se define como valor del atributo method.
<xsl:output method="html" version="4.01" encoding="UTF-8"/>
XSL - templates
Elementos de un template:
- Una hoja de estilo XSL consiste en uno o más conjuntos de reglas llamados templates:
<xsl:template>.
- Para recoger el valor de un elemento xml: <xsl:value-of select="ruta-del-elemento"/>.
- Para recorrer elementos de un mismo nodo: <xsl:for-each select="ruta-del-elemento">. Pueden
usarse operadores de comparación como en el ejemplo:
<xsl:for-each select="ciclo/dam[profesor='Secundaria']">. Otros operadores válidos son: = != <
>
- Para ordenar la salida se puede poner: <xsl:sort> dentro de for-each.
- También contamos con una estructura if, si vemos un ejemplo:
<xsl:for-each select="ciclo/daw">
<xsl:if test="horas=6">
XSL templates
- El elemento <xsl:choose> permite seleccionar de múltiples test usando <xsl:when> y
<xsl:otherwise>. Veamos un ejemplo:
<xsl:choose>
<xsl:when test="horas > 6">
<td bgcolor="#ff0044">
<xsl:value-of select="modulo"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="modulo"/></td>
</xsl:otherwise>
</xsl:choose>
XSL templates
- El elemento <xsl:apply-templates> permite aplicar el template al nodo actual o a un hijo.
Ejemplo:
<xsl:template match="/"> <xsl:template match="nombre">
.... Title: <span style="color:#ff0000">
<xsl:apply-templates/> <xsl:value-of select="."/></span>
... <br />
</xsl:template> </xsl:template>
<xsl:template match="ciclo">
<p> <xsl:template match="grado">
<xsl:apply-templates select="nombre"/> Artist: <span style="color:#00ff00">
<xsl:apply-templates select="grado"/> <xsl:value-of select="."/></span>
</p> <br />
</xsl:template> </xsl:template>
Para ver un ejemplo en acción
Ver ejemplos de todos elementos vistos
XPath
Es un lenguaje que nos permite recorrer los nodos de un documento XML hay siete tipos de
nodos:
- Raíz: es el root node, de él nacen los demás.
- Elemento.
- Atributo.
- Texto.
- Espacio de nombres.
- Instrucción de procesamiento.
- Comentario.
Cada uno de estos nodos se puede seleccionar con XPath y procesado por XSL.
XPath
Para referenciar un nodo podemos usar dos sintaxis:
1. Completa
/child::grado/child::ciclo/child:modulo/attribut::horas
2. Abreviada
/grado/ciclo/modulo/@horas.
XPath
Filtrado de nodos:
Se utilizan predicados que nos devuelven un resultado booleano.
Comparación de cadena: ciclo[modulo="SI"]
Comparación numérica (mayor): modulo[@horas > 6]
Comparación numérica (menor o igual): modulo[@horas <= 6]
Combinación de "mayor" y "no igual a": modulo[@horas < 6]/modulo[@horas != 2]
/grado[ciclo]: Comprueba si existe el elemento hijo "ciclo".
/grado/ciclo/modulo[@horas]: Comprueba si existe un atributo "horas" dentro de "modulo".
También podremos utilizar los operadores and y or.
XPath
Funciones de nodos:
local-name(..): Devuelve el nombre del elemento padre como cadena.
//modulo[position()=4]: (abreviado [4] ) Devuelve todos lo modulos que ocupen la quinta posición.
//modulo[position()=last()]: Devuelve los modulos que ocupen la última posición.
Funciones de cadena:
//ciclo[string-length(modulo) > 10 ]: Selecciona todos los ciclos cuyo modulo tenga más de 10 caracteres.
//ciclo[starts-with(modulo,'S')]: Selecciona todos los ciclos en los que el nombre del modulo comience con la letra
"S".
//ciclo[not(modulo)]: Selecciona todos los ciclos que no tengan un elemento modulo.
Recursos
La información contenida en esta presentación se han extraído de múltiple páginas web, a continuación
pongo las más relevantes y otras más que pueden servir como fuente de consulta:
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
- [Link]
Autor: Carlos Ollero Sánchez
[Link]