Empezando a trabajar con XML
A lo largo de los capítulos anteriores ya hemos visto algún ejemplo de documento XML e incluso de DTD, pero sin profundizar en su sintaxis.
A lo largo de este capítulo y los siguientes vamos a estudiar con más detalle la sintaxis y los elementos que forman un documento XML y cómo podremos construirlos y comprobar que son correctos.
El siguiente código:
Un documento XML sencillo.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE documento [
<!ELEMENT documento (p | imagen | ejemplo)*>
<!ELEMENT p (#PCDATA|destacar)*>
<!ELEMENT destacar (#PCDATA)>
<!ATTLIST destacar
importancia CDATA #REQUIRED>
<!ELEMENT imagen EMPTY>
<!ATTLIST imagen
fichero CDATA #REQUIRED>
<!ELEMENT ejemplo (#PCDATA)>
]>
<!-- Esto es un comentario -->
<documento>
<p>Mi Primer <destacar importancia="1">documento XML</destacar></p>
<p>Comienza con la etiqueta <documento></p>
<p>A continuación colocamos un elemento sin contenido</p>
<imagen fichero="imagen.gif"/>
<p>Y ahora una etiqueta CDATA.</p>
<ejemplo>
<![CDATA[
Aqui puedo poner lo que quiera.
] ]>
</ejemplo>
</documento>
Es un ejemplo de documento XML con DTD incorporada. Para cualquier persona que esté familiarizada con el HTML esta sintaxis le resultará conocida, aunque a simple vista se pueden observar algunas diferencias importantes:
Utilizo mis propias etiquetas. Y es que en XML no estamos trabajando con etiquetas predefinidas. Nosotros podemos crearnos nuestro propio lenguaje de etiquetas en función de nuestras necesidades.
La sintaxis es estricta. Ya no vale dejar de entrecomillar los atributos o utilizar las mayúsculas y minúsculas sin ningún control. La especificación XML determina claramente una serie de reglas que especifican cuando un documento está bien formado.
La utilización de una DTD. En HTML, a pesar de ser una aplicación SGML, no era obligatorio utilizarlas y, aunque para trabajar con XML tampoco será necesario, sí que será recomendable. Posiblemente no acompañen al documento XML en su distribución, pero resultan muy útiles en la elaboración y validación de los documentos.
Los elementos vacíos. Son los elementos del tipo <img>, <hr>, etc. de HTML, en los que no existe etiqueta final al no tener contenido. Ahora, en el XML, la propia etiqueta de inicio llevará una contrabarra al final que los identificará.
A lo largo de este capítulo estudiaremos todos estos detalles y muchos más, que nos permitirán ir entiendo y trabajando con documentos XML.
Marcado y datos
Un documento XML es simplemente un conjunto de cadenas de carácteres en el que, al igual que en el HTML, podemos diferenciar dos tipos de construcciones: el marcado y los datos de carácter.
El texto incluido entre los carácteres menor que < y mayor que > o entre los signos & y ; corresponde al marcado. Son exactamente las partes del documento que tiene que entender el procesador de XML.
El marcado entre los signos < y > se denomina etiqueta.
El resto no son más que datos de carácter, que corresponden a lo que sería el contenido del documento; es decir, la parte imprimible de éste.
Componentes de un documento XML
Elementos
Como podemos observar, todo documento XML se compone de uno o más elementos, cuyos límites están delimitados por etiquetas de comienzo y etiquetas de fin en el caso de que tengan contenido:
<p>Mi Primer <destacar importancia="1">documento XML</destacar></p>
Y por una etiqueta de elemento vacío en el caso de ser elementos sin contenido:
<imagen fichero="imagen.gif"/>
Cada elemento puede contener datos de carácter, elementos, ambas cosas a la vez o puede que estén vacíos.
En nuestro caso:
- El elemento documento está formado por otros elementos: p, imagen y ejemplo.
- El elemento p está formado por un contenido mixto: el elemento destacar y datos de carácter.
- El elemento imagen no tiene ningún contenido.
En el caso de elementos con contenido, las etiquetas de comienzo se componen del símbolo menor que "<", el nombre del tipo de elemento, los atributos, si los tiene, y el símbolo mayor que ">". Mientras que las etiquetas de fin se componen del símbolo menor que seguido de contrabarra "</", el nombre del tipo del elemento y el símbolo mayor que ">".
En el caso de ser un elemento vacío, sólo hay una etiqueta de elemento vacío que se forma del símbolo menor que "<", el nombre del tipo de elemento, los atributos si los tiene y se cierra con el símbolo "/>". Es importante destacar este tipo de elementos, ya que hasta ahora en el SGML y, por tanto, en el HTML entendido como aplicación SGML, los elementos vacíos sólo se representaban con una etiqueta de inicio.
Atributos
Cada elemento puede tener atributos (propiedades) que nos ofrecen información sobre el elemento.
En nuestro ejemplo:
- El elemento destacar va caracterizado con el atributo importancia, que nos indicará el grado de relevancia de su contenido.
- El elemento imagenva caracterizado con el atributo fichero, donde indicaremos el archivo que contiene la imagen.
<p>Mi Primer <destacar importancia="1">documento XML</destacar></p>
.....
<imagen fichero="imagen.gif"/>
Como podemos observar, la definición de un atributo está formada por el nombre del atributo seguido del símbolo igual "=" y, entrecomillado, el valor del atributo.
Prólogo
Los documentos XML pueden empezar con un prólogo, en el que esencialmente se define:
- Una declaración XML
- Una declaración de tipo de documento
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE documento [
<!ELEMENT documento (p | imagen | ejemplo)*>
<!ELEMENT p (#PCDATA|destacar)*>
<!ELEMENT destacar (#PCDATA)>
<!ATTLIST destacar
importancia CDATA #REQUIRED>
<!ELEMENT imagen EMPTY>
<!ATTLIST imagen
fichero CDATA #REQUIRED>
<!ELEMENT ejemplo (#PCDATA)>
]>
En la declaración XML,
<?xml version="1.0" encoding="UTF-8"?>
Indicamos:
- Información sobre la versión de XML que estamos utilizando. Por el momento sólo puede ser la versión 1.0.
- Información sobre el tipo de codificación de carácteres que estamos utilizando. En nuestro caso es el código ASCII de 7 bits, que es un subconjunto del código Unicode denominado UTF-8. No hubiese sido necesario declararlo, ya que es el que los parsers manejan por defecto.El XML soporta los siguientes esquemas de codificación:
- UTF-8
- UTF-16
- ISO-10646-UCS-2
- ISO-10646-UCS-4
- ISO-8859-1 a -9
- ISO-2022-JP
- Shift_JIS
- EUC-JP
Para que no tengamos problemas con nuestros documentos XML y podamos incluir tranquilamente acentos, ñ y demás símbolos propios de nuestra lengua es recomendable que comencemos nuestra declaración XML de la siguiente manera:
<?xml version="1.0" encoding="ISO-8859-1"?>
En la declaración del tipo de documento,
<!DOCTYPE documento [
<!ELEMENT documento (p | imagen | ejemplo)*>
<!ELEMENT p (#PCDATA|destacar)*>
<!ELEMENT destacar (#PCDATA)>
<!ATTLIST destacar
importancia CDATA #REQUIRED>
<!ELEMENT imagen EMPTY>
<!ATTLIST imagen
fichero CDATA #REQUIRED>
<!ELEMENT ejemplo (#PCDATA)>
]>
Asociamos la DTD respecto de la cual construimos el documento. En nuestro ejemplo va implícita en el propio documento XML, aunque también puede hacerse externa al documento e incluso de una forma mixta. Si la hubiésemos escrito en un fichero ejemplo.dtd tendríamos que referenciarla de la siguiente manera:
<!DOCTYPE documento SYSTEM "ejemplo.dtd">
Aunque debemos recordar que a diferencia del SGML, tenemos la posibilidad de no utilizarla.
Ambas partes del prólogo son opcionales pero en el caso de incluir ambas ,la declaración XML tiene que ir antes.
Otras construcciones de marcado
Hasta aquí hemos visto los componentes más importantes de un documento XML. Se todos modos, si observamos el ejemplo veremos que existen otros componentes que podemos utilizar:
Comentarios
Mediante los cuales podemos proporcionar información que el parser no tendrá en cuenta.
<!-- Esto es un comentario -->
Los comentarios empiezan con los caracteres "<!--" y terminan con "-->" y pueden colocarse en cualquier sitio, excepto dentro de las declaraciones, etiquetas y otros comentarios.
CDATA
Permiten integrar texto en un documento en XML,que de otra forma sería interpretado como etiqueta. Es decir, estamos introduciendo texto que luego el procesador XML va a mostrar pero que no va a procesar como marcado.
<![CDATA[
Aqui puedo poner lo que quiera.
] ]>
Los CDATA empiezan con los caracteres "<![CDATA[" y termina con "]]>".
Dentro de ellos podemos colocar cualquier cosa,ya que no va a ser interpretado, con la salvedad de la cadena que indica el final de CDATA, "]]>",debido a que el procesador, al encontrársela, entendería que la sección CDATA ya ha terminado con las nefastas consecuencias que ésto puede tener.
Entidades predefinidas
En XML existen algunos caracteres reservados que no podemos utilizar para evitar problemas con el marcado, lo que no significa que no tengan que salir en nuestros documentos XML.
En nuestro ejemplo nos aparece el caso cuando intentamos escribir la etiqueta <documento>
<p>Comienza con la etiqueta <documento></p>
Ya hemos visto que una posible solución es la utilización de CDATA, pero sin duda es poco útil cuando simplemente queremos escribir un carácter.
Las entidades predefinidas son marcas XML que se utilizan para representar estos caracteres. El XML especifica cinco entidades predefinidas:
- & para el &
- < para el <
- > para el >
- ' para el '
- " para el "
Como podemos observar, se reconocen al ir entre los símbolos "&" y ";".
Documentos bien formados y documentos válidos
Como ya hemos mencionado anteriormente, a diferencia del SGML, no es necesario que un documento XML esté asociado a una DTD.
El documento XML con el que empezábamos este capítulo,lo podíamos haber escrito de la siguiente manera:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Esto es un comentario -->
<documento>
<p>Mi Primer <destacar importancia="1">documento XML</destacar></p>
<p>Comienza con la etiqueta <documento></p>
<p>A continuacion colocamos un elemento sin contenido</p>
<imagen fichero="imagen.gif"/>
<p>Y ahora una etiqueta CDATA.</p>
<ejemplo>
<![CDATA[
Aqui puedo poner lo que quiera.
] ]>
</ejemplo>
</documento>
Y si lo pasásemos por un parser de XML no nos daría ningún error.
Por tanto, en función de si lleva asociada una DTD o no, podemos diferenciar dos tipos de documentos XML:
- Válidos, aquellos que siguen las reglas de una DTD específica.
- Bien formados (well-formed), que no tienen necesariamente una DTD asociada, pero siguen las reglas del XML al pie de la letra.
Evidentemente, los documentos válidos son bien formados.