El XML (eXtensible Markup Lenguage - Lenguaje extensible de marcas) es un un lenguaje abierto, derivado de SGML, optimizado para su uso en la WWW, y que va a permitirnos describir el sentido o la semántica de los datos. El XML, a diferencia del HTML, separa el contenido de la presentación. XML es un Meta-Lenguaje, que permite la definición de lenguajes concretos de representación de documentos. Los fundamentos del XML son muy sencillos y en principio, las únicas herramientas que nos harán falta son:

INDICE

  1. 1.- Documentos XML
    1. Introducción
    2. Documento XML "bien formado"
    3. Tipos de letra y fines de línea
    4. Estructura jerárquica de los elementos
    5. Espacios en blanco
    6. Nombrando cosas
    7. Marcas y datos
    8. Ejercicios
  2. 2.- Extensible Markup Language (XML)
    1. Prólogo y declaración de tipo de documento
    2. Declaración de documento Standalone
    3. Elementos
    4. Atributos
    5. Comentarios
    6. Entidades predefinidas
    7. Secciones CDATA
    8. Intrucciones de procesamiento
    9. Identificación del lenguaje
    10. Ejercicios
  3. 3.- Parsers XML y el Modelo Objeto Documento (DOM)
    1. Introducción: Parsers con validación y sin validación
    2. Parsers XML
    3. Modelo de Objeto Documento (Document Object Model -DOM)
    4. Trabajando con DOM en Perl:XML::DOM
    5. Ejercicios
  4. 4.- XHTML
    1. Introducción
    2. Diferencias con HTML 4.0
    3. Ejercicios
  5. 5.- Espacios de nombre (Namespaces)
    1. Introducción
    2. Definir un Espacio de Nombres
    3. Referenciar un Espacio de Nombres
    4. Definir un Prefijo De Espacio de Nombres
    5. Ejercicios
  6. 6.- Enlaces y sitios de referencia.

1.- DOCUMENTOS XML

1.- Introducción

Aunque, a primera vista, un documento XML y un documento HTML puedan parecernos muy parecidos, hay una diferencia principal y es que el HTML no indica lo que se está representando, tiene datos mal definidos con elementos de formato, mientras que el XML contiene datos que se autodefinen: describe el contenido de lo que etiquetan. Una forma rápida de entender la estructura de un documento XML es viendo un ejemplo:

<?xml version="1.0" encoding="UTF-7" ?>
<album> 
	<titulo>Joaquín Sabina</titulo> 	
        <autor>SABINA Y CIA Nos sobran los motivos</autor> 
        <formato>MP3</formato> 
	<localizacion>Varios CD5 </localizacion>
</album>

Cada documento XML posee una estructura lógica y una física. La estructura lógica del documento es una serie de declaraciones, elementos, comentarios, etc. que se indican en el documento mediante marcas explícitas. La estructura física del documento es una serie de unidades llamadas entidades, es decir, indica los datos que contendrá el documento. Las estructuras lógica y física deben anidarse de forma correcta.

2.- Documento XML "bien formado"

Todo documento XML deben estar bien formado, lo que significa que se debe cumplir lo siguiente:

Según la especificación de XML del W3C, un documento XML está bien formado si:

Cumplir la regla "document" antes mencionada significa:

3.- Estructura jerárquica de los elementos

Los documentos XML deben tener una estructura jerárquica con lo que respecta a las etiquetas que delimitan sus elementos. Esto significa que los elementos deben estar correctamente anidados y que los elementos no se pueden solapar entre ellos. Además, los elementos con contenido deben estar correctamente cerrados.

Ejemplo incorrecto:

<?xml version="1.0" ?>

 <nombre>Richal

Ejemplo correcto: 
<?xml version="1.0" ?>

 <nombre>Richal </nombre>

Sólo puede haber un elemento raíz, en el que están contenidos todos los demás, es decir, la jerarquía de elementos XML sólo puede tener un elemento inicial.

Ejemplo incorrecto:

<?xml version="1.0" ?>

 <nombre>Richal</nombre>
 <email>richal@ejemplo.com</email>

Ejemplo correcto:

<?xml version="1.0" ?>
<alumnos>
 <nombre>Richal</nombre>
 <email>richal@ejemplo.com</email>
</alumnos>

4.- Tipos de letra y fines de línea

El XML, a diferencia del HTML, es "case sensitive", es decir, trata a las mayúsculas y las minúsculas como caracteres diferentes. Si un elemento de XML está definido como "Elemento", no podemos usar "elemento" para referirnos a él.

Ejemplo con Case sensitive y solapamiento.

<?xml version="1.0" ?>
<alumnos>

 <Nombre>Richal</nombre>
 <email>richal@ejemplo.com</email>

 <nombre>Chicho</Nombre>
 <email>chicho@ejemplo.com</email>

</alumnos>

En la edición de documentos XML , por claridad, se suele organizar en varias líneas, que, normalmente, se componen de carácter de fin de línea y otro de retorno de carro. Un parser XML pasa únicamente a la aplicación el carácter de fin de línea.

5.- Espacios en blanco

En la edición de documentos XML, suele ser conveniente utilizar "espacios en blanco" (espacios, tabuladores y líneas en blanco), que normalmente son innecesarios en una versión distribuible a través de la red, aunque también existen ocasiones en los que es deseable la representación de esos "espacios en blanco" (por ejemplo, código fuente). Para que las aplicaciones preserven la representación de esos espacios en blanco en un elemento se utiliza el atributo xml:space que puede tomar los valores preserve o default, para conservar los espacios en blanco o aplicar el tratamiento por defecto, respectivamente.

Ejemplo

<?xml version="1.0"?>
<textos>
   <cita> A quien madruga Dios le ayuda ?</cita>
   <poema xml:space="preserve"> 
                 El monte es verde,
                 el agua incolora
                 y a mi no se me ocurre una rima 
   </poema>
</textos>

6.- Nombrando cosas

Un nombre en XML empieza con una letra y continúa con letras, dígitos, rayas, dos puntos o puntos, denominados de forma global como caracteres de nombre. Los nombre que empiezan por "xml" están reservados, es decir, no se pueden crear nombres que empiecen por la cadena "xml", "XML", "Xml" o cualquier otra variante, por ejemplo, el atributo xml:space visto en el apartado anterior.

7.- Marcas y datos

Las construcciones como etiquetas, referencias de entidad y declaraciones (ya veremos que es cada cosa) se denominan "marcas". Estas son las parte del documento XML que entiende el parser. El resto del documento que se encuentra entre las marcas, son los datos entendible por las personas. Las marcas en un documento XML son aquellas partes que empiezan con "<" y que acaban con ">" (por ejemplo, <Hola>, o bien, en el caso de las referencias de entidad, empiezan por "&" y acaban con ";" (por ejemplo, &quot; para representar las comillas dobles).

8. Ejercicios

Ejercicio: Hacer un ejemplo de XML donde las diferentes etiquetas (que las puedes llamar como quieras, si es en XML) estén siguiendo una jerarquía, probar en el Internet Explorer o en el Mozilla.Si no se te ocurre ningún ejemplo, haz un documento xml sobre hoteles, donde tengas nombre, teléfono, dirección(calle y número), ciudad, país, numero de estrellas, descripción del hotel, número habitaciones individuales, habitaciones dobles, habitaciones triples, suites.

Ejercicio: Hacer un segundo ejemplo de XML (o continúa el anterior) que tenga una parte donde se preserven los espacios en blanco. Como antes, lo puedes probar en el Internet Explorer o en el Mozilla. Si sigues el ejemplo anterior, mete en la parte de descripción un listado de servicios que estén tabulados.


2.- EXTENSIBLE MARKUP LANGUAJE

1.- Prólogo y declaración de tipo de documento

Aunque no es obligatorio, los documentos XML pueden, y deberían, comenzar con una línea que describa la versión de XML, el tipo de documento y otras cosas. La primera línea del prólogo o "declaración" permite especificar la versión de XML usada; hasta el momento, sólo existe la "1.0" y la codificación de caracter (US-ASCII, UTF-8, BIG5, ISO-8850-7,etc.). En general, para el castellano, usamos UTF-7 (código Unicode del que ASCII es un subconjunto) o ISO-8859-1.

Ejemplo:

<?xml version="1.0" encoding="UTF-7" ?>
<nada> Ejemplo </nada>

La segunda línea, o "declaración de tipo de documento XML", define que tipo de documento estamos creando, es decir, definimos que Declaración de Tipo de Documento (DTD - Document Type Definition) cumple y define los datos que de contiene el documento XML.

Ejemplos:

<?xml version="1.0" encoding="UTF-7" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "DTD/xhtml1-strict.dtd">
<html> 
  <body bgcolor="yellow "> 
    <p> 
      Ejemplo 
    </p> 
  </body> 
</html>
<?xml version="1.0" encoding="UTF-7" ?>
<!DOCTYPE ejemplo SYSTEM "http://www.ejemplos.xml/ejemplo.dtd">
<nada> Ejemplo </nada>

Un documento XML es válido si tiene asociado una DTD y el documento cumple las restricciones que la DTD expresa. Sólo puede haber un elemento raiz, en el que están contenidos todos los demás, es decir, la jerarquía de elementos XML sólo puede tener un elemento inicial.

2.- Declaración de documento Standalone

En la parte del prólogo dentro de la "declaración" se puede incluir una declaración de documento standalone que controla qué componentes de la DTD son necesarios para completar el procesamiento del documento.

Ejemplo:

<?xml version="1.0" standalone='yes'?>
 <nombre>Richal</nombre>

El valor "yes" indica que no existen declaraciones de marcas externas a la entidad documento. El valor "no" indica que existe o que pueden haber dichas declaraciones de marcas. La declaración de un documento standalone sólo denota la presencia de declaraciones externas.

3.- Elementos

Los elementos XML pueden tener contenido (más elementos, caracteres o ambos a la vez), o bien ser elementos vacíos. Un elemento con contenido es, por ejemplo:

Ejemplo:

 <nombre>Richal</nombre>

Siempre empieza con <etiqueta> que puede contener atributos o no, y termina con </etiqueta> que debe tener el mismo nombre. Al contrario que en HTML, en XML siempre se debe cerrar un elemento. Hay que tener en cuenta que el símbolo "<" siempre se interpreta como inicio de una etiqueta XML. Si no es el caso, el documento no estará bien-formado. Para usar ciertos símbolos se usarán las entidades predefinidas.

Ejemplo:

 <nombre>Fulanito</nombre>
 <aviso tipo="emergencia" gravedad="mortal">Que no cunda el pánico</aviso>

HTML permite elementos sin contenido, XML también, pero la etiqueta debe ser de la siguiente forma: <elemento-sin-contenido/>, que puede contener atributos o no, esto es debido que no hay una etiqueta de cierre que delimite el contenido . El los siguientes ejemplos se ve esto:

Ejemplos:

 <identificador DNI="23123244"/>
<?xml version="1.0" encoding="UTF-7" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "DTD/xhtml1-strict.dtd">
<html> 
  <body bgcolor="yellow "> 
    <hr/> 
    <p> 
      Entre lineas
    </p> 
    <hr/>
  </body> 
</html>

4.- Atributos

Los elementos pueden tener atributos, que son una manera de incorporar características o propiedades a los elementos de un documento.

Ejemplo:

 <alumno nota="5 pelón" asistencia="Nula">Richalson</alumno>

En una Definición de Tipo de Documento, se especifica los atributos que puede tener cada tipo de elemento, así como sus valores y tipos de valor posible. Los atributos tienen que estar delimitado con comillas dobles ( " ) o comilla simple ( ' ). Cuando se usa uno para delimitar el valor del atributo, el otro se puede usar dentro.

Ejemplo:

<noticia titulo="Richal O'Donnel gana el pulitzer" autor='Pepe "Porras"'>
</noticia>

A veces, un elemento con contenido puede modelarse como un elemento vacío con atributos.

Ejemplo:

<gato><nombre>Micifú</nombre><raza>Persa</raza></gato>
<gato raza="Persa">Micifú</gato>
<gato raza="Persa" nombre="Micifú"/>

5.- Comentarios

Los comentarios pueden aparecer en cualquier punto del documento, fuera del resto de las marcas,es decir, fuera de las declaraciones etiquetas u otros comentatios.Tienen el mismo formato que los comentarios de HTML, por lo que comienzan con "<!--" y terminan con "-->". La cadena "--" no puede aparece dentro de un comentario.

Ejemplo:

<!-- Que gran gato es Micifú -->
<gato raza="Persa" nombre="Micifú"/>

6.-Entidades predefinidas

En XML 1.0 se definen cinco entidades para representar caracteres especiales y que no se interpreten como marcas por el parser XML. Es decir, asi podemos utilizar, por ejemplo, el carácter "<" sin que se interprete como comienzo de una etiqueta XML.

ENTIDAD

CARACTER

&amp;

&

&lt;

<

&gt;

>

&apos;

'

&quot;

"

Ejemplo:

<?xml version="1.0" encoding="UTF-7" standalone='yes'?>
<ejemplos>
<descripcion>Lo siguiente es un ejemplo de HTML.</descripcion>
<ejemplo>
     &lt;HTML&gt;
       &lt;HEAD&gt;
        &lt;TITLE&gt;Rock &amp; Roll&lt;/TITLE&gt;
       &lt;/HEAD&gt;
</ejemplo>
</ejemplos>

7.- Secciones CDATA

Las secciones CDATA también nos van a permitir especificar datos, utilizando cualquier carácter, especial o no, sin que se interprete como una marca XML. La razón es que asi se puede leer más fácilmente el documento XML sin tener que descifrar los códigos de las entidades. Las secciones CDATA empiezan por la cadena "<![CDATA" y terminan con la cadena "]]>" y sólo ésta última se reconoce como marca. No se pueden anidar secciones CDATA

Ejemplo:

<?xml version="1.0" encoding="UTF-7" standalone='yes'?>
<ejemplos>
<descripcion>Lo siguiente es un ejemplo de HTML.</descripcion>
<ejemplo>
   <![CDATA[
     <HTML>
       <HEAD>
        <TITLE>Rock & Roll</TITLE>
       </HEAD>
   ]]>
</ejemplo>
</ejemplos>

8.- Instrucciones de procesamiento

Las intrucciones de procesamiento permiten a los documentos XML contener instrucciones para las aplicaciones, van entre <? y ?>

Ejemplo:

<?xml version="1.0"?>
<?cocoon-process type="xslt">

no son parte del documento, pero deben ser pasadas a la aplicación. En el ejemplo, se le dice al cocoon (herramienta para publicar xml en la web) que la página XML es un XSLT (que ya vereis lo que es).

9.- Identificación del lenguaje

En el procesado de documentos puede ser útil la identificación entre el lenguaje natural o el lenguaje formal, en el que está escrito el contenido. Una atributo especial denominado xml:lang puede ser insertado en los documentos para especificar el lenguaje utilizado en los contenidos y los valores de atributo de cualquier elemento en un documento.

Ejemplo:

<?xml version="1.0" encoding="UTF-7" standalone='yes'?>
<ejemplos>
 <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
 <p xml:lang="en-GB">What colour is it?</p>
 <p xml:lang="en-US">What color is it?</p>
 <sp who="Faust" desc='leise' xml:lang="de">
   <l>Habe nun, ach! Philosophie,</l>
   <l>Juristerei, und Medizin</l>
   <l>und leider auch Theologie</l>
   <l>durchaus studiert mit heißem Bemüh'n.</l>
 </sp>
 <sp who="yo"  desc='comentario' xml:lang="es">
   <l>No me entero de un pimiento</l>
</sp>
</ejemplos>

10. Ejercicios

Todos los ejercicios que se proponen a continuación deben de usar un prólogo y hacer uso de los comentarios.

Ejercicio: Hacer un documento standalone de XML sobre una base de datos de alumnos usando sólo elementos con contenido (por ejemplo, nombre, apellidos, nota, DNI, e-mail). Prueba que esté bien formado en el Internet Explorer o en el Mozilla.

Ejercicio: Pasar el anterior documento XML a elementos sin contenido, usando atributos. Prueba que esté bien formado en el Internet Explorer o en el Mozilla.

Ejercicio: Haz un documento XML que contenga secciones de una página HTML (estamos rizando el rizo), por ejemplo, las etiquetas y contenidos de HEAD (cabecera), la etiqueta P (párrafo) y una lista sin orden (<ul> <li> ...</ul>);. Usa para esto secciones CDATA y entidades predefinidas. Prueba que esté bien formado en el Internet Explorer o en el Mozilla . Si no se ocurre ningún ejemplo, coge una de los descripciones del ejercicio de los hoteles y escribe sus caracteríscas en un listado.Hazlo primero con entidades predefinidas y luego con una sección CDATA.

Ejercicio: Haz un documento XML con un par de elementos cuyo contenido varíe dependiendo del lenguaje. Prueba que esté bien formado en el Internet Explorer o en el Mozilla. Si no se te ocurre ninguno coge el ejercicio de los hoteles y escribe descripciones en un par de idiomas.


3.- PARSERS XM L

1. Introducción: Parser con validación y sin validación

Un parser o procesador o analizador sintáctico lee el documento XML y verifica que es XML bien formado; algunos también comprueban que el código XML sea válido. El parser o procesador de XML es la herramienta principal de cualquier aplicación XML. Mediante el parser no solamente podemos comprobar si nuestros documentos son bien formados o válidos, sino que también podemos incorporarlos a nuestras aplicaciones, de manera que estas puedan manipular y trabajar con documentos XML.

Podemos dividir los parsers XML en dos grupos principales:

En el caso de utilizar un DTD, es preferible utilizar un parser con validación.

2. Parsers XML

Normalmente no nos tendremos que preocupar de buscar un parser concreto para comprobar la validez de nuestros documentos XML, ya que los desarrolladores de las aplicaciones que utilizaremos como navegadores o visualizadores o transformadores de esos documentos en el documento final que el usuario ve, incluirán sus propios parsers. Un ejemplo de esto es el caso del Microsoft Internet Explorer 5.x, que utiliza el parser de MS (incluido en la librería MSXML.DLL); o el caso de Mozilla, que internamente utiliza el parser EXPAT (escrito en C).

A continuación teneis un parser sin validación escrito en JavaScript. Presenta el árbol del documento a comprobar.

Teclea o copia el código XML aquí y pulsa en "Procesar"

3. Modelo de Objeto Documento (DOM)

Para extraer la información que contiene un documento XML, se podría escribir código para analizar el contenido del archivo XML, pues no deja de ser un archivo de texto, tal y como lo podríamos hacer con HTML. Sin embargo, esta solución no es muy aconsejable y desaprovecharía una de las ventajas de XML: el ser una forma estructurada de representar datos.

La mejor forma de recuperar información de archivos XML es utilizar un parser de XML, que sea compatible con el modelo de objeto de documento (DOM) de XML. DOM define un conjunto estándar de comandos que los parsers devuelven para facilitar el acceso al contenido de los documentos XML desde sus programas. Un analizador de XML compatible con DOM toma los datos de un documento XML y los expone mediante un conjunto de objetos que se pueden programar.

DOM para XML es un modelo de objetos estándar (propuesto por el W3C) que muestra el contenido de un documento XML. La Especificación del Modelo de Objeto de documento (DOM) del W3C define actualmente lo que debería mostrar un DOM como propiedades, métodos y eventos.

En http://www.microsoft.com/spain/msdn/articulos/archivo/051299/dhtml/beginner.asp puedes ver una introducción de com se haría en Visual Basic, en http://www.ibium.com/alf/xmlcomo poder hacerlo con JAVA, en http://users.erols.com/enno/xml/index.html como hacerlo con Perl, en http://sourceforge.net/projects/expat/ como hacerlo en C usando expat (el parser del Mozilla) y en http://support.microsoft.com/directory/article.asp?ID=KB;EN-US;Q301101 como hacerlo en .NET

Veamos un ejemplo, supongamos el siguiente trozo de código XML:

 <TABLE>
  <TBODY> 
   <TR> 
       <TD>Shady Grove</TD>
       <TD>Aeolian</TD> 
   </TR> 
   <TR>
       <TD>Over the River, Charlie</TD>        
       <TD>Dorian</TD> 
   </TR> 
  </TBODY>
 </TABLE>

4. Trabajando con DOM en Perl: XML::DOM

En este apartádo vamos a ver como trabajar con el Modelo de Objeto Documento (DOM) usando Perl, para los que no sepan Perl en http://www.granavenida.com/perl/index.htm hay un tutorial en castellano de Perl muy bueno y en http://geneura.ugr.es/~javi/dbi/modulos.htm como instalar módulos en perl. Para manejar el DOM bajo Perl vamos a utilizar el módulo XML::DOM que lo podeis encontrar en http://search.cpan.org/search?dist=libxml-enno. El módulo XML::DOM se basa en el módulo XML::Parser y éste a su vez en la librería del expat (parser de libre distribución del Mozilla). Para consultar los métodos y objetos del módulo XML::DOM podeis mirar en http://theoryx5.uwinnipeg.ca/CPAN/data/libxml-enno/XML/DOM.html.

Para comprender mejor como se trabaja con el DOM en Perl, vamos a a usar el siguiente documento XML de ejemplo:

<?xml version="1.0" standalone="yes"?>
<noticias>
        <!--Noticia 1 -->
	<noticia tipo="economia">
	  <titulo url="http://www.elpais.es/articulo.html?anchor=elpepieco&amp;xref=20010215elpepieco_14&amp;type=Tes&amp;d_date=20010215">
		Microsoft, investigado por invertir en un rival
	  </titulo>
          <fecha>15 de febrero de 2001</fecha>
	  <contenido>
               El gigante de la informatica Microsoft, pendiente
		de una apelacion para evitar ser dividido en dos por
		vulnerar la competencia, está siendo investigado otra vez por las autoridades
		antimonopolio, que sospechan de por que el mayor fabricante de programas invirtio
		135 millones de dolares (24.165 millones de pesetas) en su rival Corel.
	  </contenido>
	 </noticia>

	<!--Noticia 2 -->
	<noticia tipo="internet">
	  <titulo url="http://www.abc.es/Internet/noticia.asp?id=13298&amp;dia=18022001">
		 Clinicas reales y virtuales para tratar adictos a Internet
	  </titulo>
          <fecha>18 de febrero de 2001</fecha>
	  <contenido>
                   La aparicion de una nueva patologia, la "dependencia" a internet, esta confirmada por la creacion
                   de numerosas clinicas en Estados Unidos, reales o virtuales, para tratar de remediar las
                   enfermedades de la red....
	  </contenido>
	 </noticia>

</noticias>

En el ejemplo anterior se tiene un documento XML que está pensado para trabajar con noticias que aparecen en Internet. Lo que vamos a hacer es, usando Perl y el módulo XML::DOM, un programa que procese el documento xml y muestre el titulo de las noticias.

#!/usr/bin/perl
#Indicamos al perl que use el modil XML::DOM
use XML::DOM;
#Creamos un parser XML
$parser = new XML::DOM::Parser;
#Hacemos el parser XML al fichero ejmploDOM.xml y obtenemos el DOM
$doc = $parser->parsefile ("ejemploDOM.xml");
# Cogemos el titulo todas las noticias del documento XML
$noticias = $doc->getElementsByTagName ("titulo");
#Cogemos el número de noticias
$n = $noticias->getLength;
#Escribimos el título de cada noticia
for (my $i = 0; $i < $n; $i++)
{
   #Cogemos el tiltulo de la noticia i
   my $noticia = $noticias->item ($i);
   #Imprimimos el nombre de la etiqueta
   print $noticia->getTagName;
   print ": ";
   #Cogemos el hijo (texto) de la etiqueta que estamos procesando
   my $noticia_contenido = $noticia->getFirstChild;
   #Imprimimos el contenido del hijo
   print $noticia_contenido->getData;
   print "\n";
}
# Escribimos la salida del parser (el documento XML) en un fichero
$doc->printToFile ("salida.xml");
# Escribimos el documento XMl en pantalla
#print $doc->toString;
# Limpiamos la memoria ocupada por el documento XML
$doc->dispose;
Ahora vamos a hacer un segundo ejemplo donde mostraremos las noticias, y la 
url correspondiente
#!/usr/bin/perl
#Usamos el módulo XML::DOM de Perl
use XML::DOM;
#Creamos un parser XML
$parser = new XML::DOM::Parser;
#Hacemos el parser XML al fichero ejmploDOM.xml
$doc = $parser->parsefile ("ejemploDOM.xml");
# Cogemos los nodos del DOM cuyas etiquetas sean titulo
$noticias = $doc->getElementsByTagName ("titulo");
#Cogemos el número de noticias
$n = $noticias->getLength;
#Escribimos el título de cada noticia
for ($i = 0; $i < $n; $i++)
{
 	#Cogemos el tiltulo de la noticia i
	$noticia = $noticias->item ($i);
	#Imprimimos el nombre de la etiqueta
	print $noticia->getTagName;
	print ": ";
	#Cogemos el hijo (texto) de la etiqueta que estamos procesando
	my $noticia_contenido = $noticia->getFirstChild;
	#Imprimimos el contenido del hijo
	print $noticia_contenido->getData;
	#Cogemos el valor del atributo url
	$mi_url= $noticia->getAttributeNode("url");
	#Imprimimos el contenido de dicho atributo
	print " (href=";
	print $mi_url->getValue;
	print " )\n";
}
# Limpiamos la memoria ocupada por el documento XML
$doc->dispose;

Ahora vamos a hacer un tercer ejemplo donde recorremos el DOM 
#!/usr/bin/perl
#Usamos el módulo XML::DOM de Perl
use XML::DOM;
#Creamos un parser XML
my $parser = new XML::DOM::Parser;
#Hacemos el parser XML al fichero ejmploDOM.xml
my $doc = $parser->parsefile ("ejemploDOM.xml");
#Cogemos el nodo raiz
my $raiz = $doc->getFirstChild;
#Como el nodo raiz está en lo alto de la jerarquía, ponemos profundidad =0
my $profundidad=0;
#Mostramos el árbol xml
muestra_arbol($raiz,$profundidad);
# Limpiamos la memoria ocupada por el documento XML
$doc->dispose;
#------------------------------------------------------------------------
sub muestra_arbol()
{
 	#Cogemos los dos parámetros el nodo del árbol y la profundidad
	my ($nodo, $profundidad)=@_;
	#Miramos el tipo de nodo, si es de texto (hoja del DOM) decimos que hay datos
	if ($nodo->getNodeType==TEXT_NODE) {
		for (my $i=0; $i < $profundidad; $i++) {print " "};
		print $nodo->getData;
		print "\n";
	}

        #Miramos el tipo de nodo, si es un comentario
	elsif ($nodo->getNodeType==COMMENT_NODE) {
		for (my $i=0; $i < $profundidad; $i++) {print " "};
		print "COMENTARIO\n";
	}
        #No es nodo hoja, lo mostramos y recorremos sus hijos
	else
	{
         	 #Nos vamos a la derecha dependiendo de la profundidad
		 for (my $i=0; $i < $profundidad; $i++) {print" "};

		 #Mostramos la etiqueta del nodo
		 print $nodo->getTagName;
		 print "\n";

		#Cojemos los nodos hijos y el número que hay
		my $hijos=$nodo->getChildNodes;
		my $n=$hijos->getLength;

		#Para cada nodo hijo, mostramos su etiqueta y mostramos su subarbol
		for (my $i;$i < $n; $i++)
		{
                   #Cogemos el hijo i
                   my $hijo=$hijos->item($i);

                   #Exploramos el subarbol del hijo i
                   muestra_arbol($hijo,profundidad+1);
		}

	}
}
#------------------------------------------------------------------------

Resumiendo, como podemos ver, con XML es mucho más fácil (dentro de lo que 
cabe) procesar la información que lo era antes con HTML, ya que para procesar 
una página HTML (no XHTML) teníamos que trabajar con ella como si fuera texto 
plano.

5. Ejercicios

Ejercicio: Probar alguno de los códigos que se han escrito anteriormente en el parser XML on-line que teneis aquí. Probad como no funciona bien si el código XML está no está bien formado (Si es que no lo habeis probado anteriormente)

Ejercicio: Dibuja cual sería el DOM de uno de los documentos XML realizado en ejercicios anteriores (Escoge, pRID01CYB el ejercicio del hotel). Este ejercicio os ayudará a comprender cómo trabajan las aplicaciones sobre XML, y como manipulareis el árbol generado por un documento XML desde vuestra aplicación

Ejercicio:Coge el documento XML del ejercicio anterior y muestra el contenido de algún elemento del mismo, que se repita varias veces (si has cogido el ejemplo del hotel, que escriba los nombres de los hoteles>

Ejercicio:Coge el documento XML del ejercicio anterior y muestra el contenido de algún elemento del mismo, generando una página HTML. Basta que la página se vea por pantalla y luego podeis verla con el mozilla. (para guardar la salida por pantalla del ejemplo se haría de la siguiente forma: ejercicio.pl > pagina.html). Si sigues con el ejemplo de los hoteles que escriba una página html con los nombres de los hoteles.


4.- XHTM L

1. Introducción

XHMTL es una especificación del W3C que define un HTML escrito de forma que cumpla las normas sintácticas del XML. Como XHTML es unaRID01CYBacute;n del XML, ha sido diseñado para ser ampliable (eXtensible).

XHTML ha sido diseñado pensando en la portabilidad, y en su visualización en diferente hardware (PCs, PDAs,Teléfonos, etc.). Aunque no es obligatorio, los documentos XML pueden, y deberían, comenzar con una línea que describa la versión de XML, el tipo de documento y otras cosas. Aunque no hay ninguna obligación de que los documentos XHTML sean compatibles con las aplicaciones existentes, en la práctica es algo fácil de conseguir.

2. Diferencias con HTML 4.0

Debido al hecho de que XHTML es una aplicación XML, ciertas prácticas que eran perfectamente válidas en HTML 4.0, tiene que cambiar y son las siguientes:

3. Ejercicios

Ejercicio: Escoger una página HTML y pasarla a XML. Si no se os ocurre ninguna escoged esta misma, que no está bien formada :( . Probad como no funciona bien si el código XHTML está no está bien formado, usad el Internet Explorer o el Mozilla.


5.- ESPACIOS DE NOMBRE

1. Introducción

El objetivo principal de la especificación de espacios de nombre es permitir que el autor del documento le diga al analizador o parser qué DTD usar cuando analice un elemento dado. Es decir, que para una etiqueta se especifica que DTD usar, por lo que esto sólo tiene sentido si se usa más de un DTD. Por ejemplo, supongamos que tenemos una hoja xml con libros y otra con discos (con sus correspondientes DTD) y queremos mezclar ambas páginas. Habrá elementos que no se llamen igual (páginas o tiempo), pero otros que si (titulo, autor). Entonces se usarían ambos DTD y utilizaríamos los espacios de nombre para distinguir aquellos elementos en los que no esté claro a que DTD pertenecen.

Aunque el motivo de la especificación de los espacios de nombres fue usar más de un DTD, en la realidad ninguna herramienta soporta más de un DTD (yo, al menos, no he visto ninguna), por lo que sólo se utilizan los prefijos de espacios de nombres (que veremos dentro de poco) en XSLT(que se verá más tarde), es decir, se utilizan para distinguir las etiquetas propias de XSLT con las etiquetas del formato de salida , por ejemplo, XHTML o WML. Los espacios de nombres se aplican tanto a atributos como a elementos. En este apartádo sólo hemos considerado elementos. Para más información sobre los atributos, puedes ver la especificación del W3C en http://www.w3.org/TR/REC-xml-names

2. Definir un espacio de nombres

Para definir un espacio de nombres al que pertenece un elemento, es necesario añadir un atributo a la definición de elemento, donde el nombre del atributo sea xmlns ("xml namespace") y el valor puede ser una cadena cualquiera, aunque por convención suelen ser URLs. Por ejemplo, podemos hacer esto añadiendo una entrada como la siguiente en la lista de definición de atributos de un elemento title:

<!ELEMENT title (%inline;)*>
<!ATTLIST title
   xmlns CDATA #FIXED "http://www.ejemplos.xml/slideshow"
>

Declarar el atributo como FIXED tiene varias características importantes:

Cada nombre de elemento en nuestro DTD obtendría exactamente el mismo atributo con el mismo valor.

3. Referenciar un espacio de nombres

Cuando un documento usa un nombre de elemento que existe sólo en uno de los ficheros DTD que referencia, el nombre no necesita estar cualificado(tiempo y páginas en el ejemplos de los discos y de los libros). Pero cuando se usa un nombre de elemento que tiene varias definiciones, se necesita algún tipo de cualificación (nombre de disco y nombre de libro, por ejemplo). Cualificamos una referencia a un nombre de elemento especificando el atributo xmlns, como se ve a continuación:

< title xmlns="http://www.example.com/slideshow" > Tutorial </title>

El espacio de nombres se aplica a ese elemento, y a cualquier elemento contenido dentro de él.

4. Definir un prefijo de espacio de nombres

Usando el atributo xmls, cuando necesitamos una sóla referencia a un espacio de nombres, no es mucho trabajo, pero cuando necesitamos hacer la misma referencia varias veces, añadir dicho atributo se convierte en una tarea algo pesada. También hace dificil cambiar el nombre del espacio de nombres, en caso de que se quiera modificar posteriormente. La alternativa es definir un prefijo de espacio de nombres, que es tan sencillo como especificar xmlns, dos puntos (:) y el nombre del prefijo antes del valor del atributo, como se ve a continuación:

<sl:slideshow xmlns:sl='http://www.example/slideshow'
        ...>
     ...
</sl:slideshow>

Esta definición configura sl como un prefijo que puede usarse para cualificar el nombre del elemento actual y cualquier elemento dentro de él. Como el prefijo puede usarse en cualquier elemento contenido, tiene más sentido definirlo en el elemento raiz del documento XML. Cuando el prefijo se usa para cualificar un nombre de elemento, la etiqueta final también incluye el prefijo, como se muestra aquí:

<sl:slideshow xmlns:sl='http://www.example/slideshow'
        ...>
     ...
     <slide>
         <sl:title> Tutorial <sl:title>
     </slide>
     ...
</sl:slideshow>

Finalmente podemos observar que se pueden definir varios prefijos en el mismo elemento, como se muestra a continuación

<sl:slideshow xmlns:sl='http://www.example/slideshow'
                 xmlns:chtml="urn: ...">  
     ...
</sl:slideshow>

3. Ejercicios

Ejercicio: Veamos un ejemplo, donde se tiene información de libros en XML, pero, a su vez, se quiere usar HTML para mostrar la información:

 <h:html xmlns:xdc="http://www.xml.com/books"
         xmlns:h="http://www.w3.org/HTML/1998/html4">
 <h:head><h:title>Book Review</h:title></h:head>
 <h:body>
    <xdc:bookreview>
    <xdc:title>XML: A Primer</xdc:title>
      <h:table>
      <h:tr align="center">
          <h:td>Author</h:td><h:td>Price</h:td>
          <h:td>Pages</h:td><h:td>Date</h:td></h:tr>
      <h:tr align="left">
          <h:td><xdc:author>Simon St. Laurent</xdc:author></h:td>
          <h:td><xdc:price>31.98</xdc:price></h:td>
          <h:td><xdc:pages>352</xdc:pages></h:td>
          <h:td><xdc:date>1998/01</xdc:date></h:td>
      </h:tr>
      </h:table>
    </xdc:bookreview>
 </h:body>
 </h:html>

En el ejemplo los elementos que tiene el prefijo xdc están asociados a un espacio de nombres cuyo identificador es http://www.xml.com/books, mientras que los que tienen el prefijo h están asociados con un espacio de nombres cuyo identificador es http://www.w3.org/HTML/1998/html4. El ejercicio tratará de hacer lo mismo que en el ejemplo anterior pero para mostrar música en MP3 en HTML. Si no sabeis como empezar, haced primero una página en XHTML y, segundo, otra siguiendo un formato de vuestra invención (por ejemplo autor, disco, fecha, estilo, etc.).


6.- ENLACES

                                                                                                        © 2001 Javier de Lucas