You are on page 1of 4

### 5.6.2. DOM.

La jungla de las siglas. Otra ms que aadir a la coleccin. DOM significa *modelo de
objetos de documento* (Document Object Model). Seguro que as, sin ms, la ayuda de
esta traduccin es poca o nula.
DOM es un conjunto de interfaces que nos permiten acceder al contenido de un doc
umento XML o modificarlo a nuestro antojo. Se trata de una herramienta cuyo uso
es muy sencillo gracias a la metfora que elige: el rbol. Los elementos del documen
to (etiquetas y sus nombres, atributos, texto del contenido, incluso las instruc
ciones de proceso) se transforman en nodos a cuyas propiedades tenemos pleno acc
eso.
Una vez que hayamos cargado el documento dentro de DOM podemos movernos por todo
s los nodos con total libertad, recorrindolos en profundidad, de arriba abajo, o
dentro del mismo nivel. De cada nodo podemos obtener informacin sobre su nombre,
su valor o sus atributos. Adems, a partir de l podemos movernos a otros nodos en f
uncin de la relacin que tenga con ellos: padre, hijo o hermano.
Cuando abrimos un documento XML utilizando DOM, lo ms probable es que estemos uti
lizando ejemplares de una jerarqua de clases, esto es, objetos. No pretende ste s
er un manual de programacin orientada a objetos, ni que el lector tenga esos cono
cimientos. Si es el caso y sus conocimientos de programacin son limitados, no se
asuste en lo ms mnimo.
#### Implementaciones de DOM
DOM es una recomendacin del W3C. Toda la informacin que necesitemos sobre DOM est d
isponible en la pgina web del W3C.
Sin embargo, la mayora de nosotros esa informacin nos va a servir de poco. La espe
cificacin de DOM es tarea del W3C, y se trata de un trabajo digno de elogio que o
tros debern convertir en realidad.
Microsoft ofrece una implementacin de DOM para las diferentes versiones de su sis
tema operativo Windows y forma parte de lo que se conoce como MSXML. Todo lo que
Microsoft puede ofrecernos relacionado con esta tecnologa est disponible en su pgi
na web.
Pero existen otras implementaciones de la norma:
- **Sablotron**. Disponible tanto para Windows como para Linux. No slo nos propor
ciona una implementacin de DOM, tambin del resto de bibliotecas necesarias para tr
abajar con documentos XML.
- **libgdome**. Desarrollada para el proyecto Gnoe, est construida sobre *libxml^
.
Y es que existen implementaciones de DOM para todos los gustos. Ahora bien, cul de
ellas utilizamos en este apartado para aprender su funcionamiento? Pues precisa
mente la que no mencionamos anteriormente, la que incorpora .NET/Mono, la plataf
orma de desarrollo que hemos seleccionado para los ejemplos.
#### Tareas comunes
Sea cual sea la implementacin de DOM que utilicemos, existen tres tareas que pode
mos realizar y que, de hecho, repetiremos con frecuencia. Son las siguientes:
- **Carga**. Conversin del documento XML en una jerarqua de objetos para que nos s
ea ms sencillo manipular su contenido.
- **Localizacin**. Desplazamiento por los diferentes elementos del docuemnto. Pod
emos movernos de la raz a las ramas, de forma lateral o acceder de forma directa
a algn elemento en concreto.
- **Creacin**. Tambin podemos modificar el contenido del documento XML, aadiendo o
modificando elementos, atributos o contenidos.
Para ayudarnos en nuestro aprendizaje vamos a utilizar un documento XML que quiz
ya conozca.
#### XML de trabajo
Como viene siendo costumbre durante todo este manual, vamos a trabajar con un do
cumento XML que contiene datos sobre una de las pelculas de Terry Gilliam: *Brazi
l*. El contenido de este documento es el siguiente:
<?xml version="1.0" encoding="iso-8859-15"?>
<pelicula titulo="Brazil" estreno="1985" minutos="142">
<direccion>
<director nombre="Terry" apellidos="Gilliam"/>
</direccion>
<produccion>
<productor nombre="Terry" apellidos="Gilliam"/>
<productor nombre="Arnon" apellidos="Milchan"/>
</produccion>
<guion>
<guionista nombre="Terry" apellidos="Gilliam"/>
<guionista nombre="Tom" apellidos="Stoppard"/>
<guinosta nombre="Charles" apellidos="McKeown"/>
</guion>
<reparto>
<interprete nombre="Jonathan" apellidos="Pryce" papel="p
rotagonista"/>
<interprete nombre="Robert" apellidos="De Niro" papel="p
rotagonista"/>
<interprete nombre="Kim" apellidos="Greist" papel="prota
gonista"/>
<interprete nombre="Michael" apellidos="Palin" papel="se
cundario"/>
<interprete nombre="Ian" apellidos="Holm" papel="secunda
rio"/>
<interprete nombre="Bob" apellidos="Hoskins" papel="secu
ndario"/>
</reparto>
<esloganes>
<eslogan>
Vuelos fantsticos.
La pesadilla de la realidad.
Ataques terroristas.
Compras a media noche.
Amor verdadero.
Y fontanera creativa.
</eslogan>
</esloganes>
</pelicula>
####Creacin de un nuevo proyecto
El primer paso para poder seguir todos los ejemplos es crear un proyecto con el
entorno de desarrollo que haya hemos seleccionado (Visual Studio y .NET sobre Wi
ndows, Xamarin Studio y Mono sobre macOS/Linux).
Slo hemos de seguir una sencilla secuencia de pasos.
1. Abra el IDE (Visual Studio/Xamarin Studio)
2. Seleccione File > New Solution >
3. Seleccione Other > .NET > Console Project (C#)
4. Asigne un nombre al proyecto en el cuadro de texto. En este caso, hemos utili
zado el nombre **DOM**, pero se puede escoger el que quiera. Procure que sea des
criptivo. La ruta que aparece en el cuadro de texto *Localizacin* ser, por defecto
, la carpeta Visual Studio/Xamarin Studio Projects, dentro de su carpeta Mis doc
umentos. Puede cambiarla si lo desea.
5. Para terminar, haga clic en el botn *Crear*. El IDE le mostrar un proyecto vaco
en el que poer escribir su propio cdigo. Este proyecto recin creado ya funciona. P
odemos ejecutarlo y podremos ver como resultado una consola con el mensaje "Hell
o World!".
#### Carga
El primer paso de cualquier operacin que queramos realizar con DOM es la carga de
l analizador. Para tener acceso a DOM desde nuestro entorno de trabajo hemos de
utilizar la biblioteca *System.xml* y as lo indicamos con la instruccin using *Sys
tem.Xml*. Cree un nuevo proyecto, elimine todo el cdigo de *Main.cs* y sustituyal
o
Si ejecuta el programa, todo lo que ver ser una venta de consola pidindonos que pul
semos una tecla para continuar. Es lgico: el programa anterior se limita a crear
un ejemplar de la clase *XmlDocument*. Utilizaremos el objeto resultante, *doc*,
para jugar con DOM.
Ahora que ya tenemos un ejemplar de la clase *XmlDocument*, vamos a abrir nuestr
o documento XML. Slo hemos de cambiar la parte que se encuentra entre las llaves
del bloque *try*.
Cuando haya realizado esa modificacin, vuelva a ejecutar el programa. Aparecer un
error, porque el programa no encuentra el fichero XML, ya que DOM no ha sido ca
paz de localizar el archivo *brazil.xml* porque no le hemos dicho exactamente dnd
e se encuentra.
Para solucionar este problema vamos a incluir el archivo XML como un recursos em
bebido dentro de nuestro proyecto. .NET permite encapsular archivos como parte d
el ensamblador compilado. Estos archivos son conocidos como recursos embebidos.
Estos recursos estn completamente se parados de los archivos *.resources* y *.res
x* que estn asocidos con el ensamblador. Podemos acceder a estos recursos en el t
iempo de ejecucin a travs de la clase *Assembly* del espacio de nombre *System.Ref
lection*.
Una gran ventaja de los recursos embebidos al *Manifest* es que al estos archivo
s formar parte del ensamblador compilador, el usuario no puede accidentalmente b
orrar o perder archivos que son crticos para la aplicaicn, que en algunos casos pu
eden impedir la execucin del programa. Una limitacin de este mtodo es que no podemo
s guardar cambio alguno en el archivo sin recompilar el programa. Por esto, solo
debemos incluir archivos que no van a cambiar a lo largo del ciclo de vida de l
a aplicacin como recurso embebido.
Aadimos los espacios de nombre correspondientes:
System.IO;
System.Reflection;
Dentro de la clase principal, inicializamos las siguientes variables
Assembly _assembly;
Stream _xmlStream;
Y dentro del bloque try, insertamos:
_assembly = Assembly.GetExecutingAssembly();
_xmlStream = _assembly.GetManifestResourceStream("Project.brazil.xml");
XmlDocument doc = new XmlDocument();
doc.Load(_xmlStream);
Console.Write(doc.InnerXml);
Si todo ha ido bien, el error no vuelve a aparecer.
Aunque hemos conseguido cargar el documento XML, es bastante complicado ver algo
en toda esa maraa de caracteres. Antes de cargar el documento con *doc.Load()* v
amos a indicarle a DOM que queremos conservar los espacios del documento, as:
...
doc.PreserveWhitespace = true;
doc.Load(_xmlStream);
...
Ejecute ahora el programa. Algo mejor, verdad?
Ya sabemos cmo cargar un documento XML dentro de DOM. Veamos cmo utillizar lo apre
ndido hasta ahora para extraer sus datos.
#### Movimiento
Como ya hemos comentado, la carga de un documento XML dentro de DOM distribuye s
us elementos en forma de rbol. Dado el documento XML con el que estamos trabajand
o, se pueden representar en un rbol. Para simplificar hay elementos que no se mue
stran en dicha figura. Los mostrados son suficientes para introducir las relacio
nes entre nodos que DOM nos permite aprovechar.
La raz del documento XML es *pelicula*. De ese elemento descienden todos los dems.
Podramos decir entonces que es el padre de todos los elementos. Son hijos suyos
*direccion*, *guion*, *produccion*, *reparto* o *esloganes+.
Fijmonos en uno de los elementos hijo del elemento *pelicula*: el elemento *direc
cion*. Este elemento tiene, a su vez, un hijo: el elemento *director*. Podramos d
ecir que *director* es el nieto de *pelicula*, pero vamos a limitarnos a utiliza
r relaciones de un paso. La misma situacin se repite con el elemento *reparto*.
Podemos dividir estas relaciones en dos clases: horizontales y verticales.
- Las **relaciones verticales** son las que se dan entre padres e hijos. Son ver
ticales porque nos permiten recorrer el rbol desde la parte de arriba a la de aba
jo.
- Las **relaciones horizontales** se dan entre nodos hermanos. Estas relaciones
se dan en el mismo nivel del rbol que DOM nos proporciona.
Para DOM, cada elemento que forma parte del documento XML es un nodo. Es fcil com
prender la analoga si vuelve a mirar el diagrama que creamos anteriormente. Cada
nodo puede estar compuesto a su vez de otros nodos. Estos nodos tienen una serie
de atributos, que son los mismos que tiene su equivalente en el documento.
Dependiendo de cmo nos queramos mover dentro del rbol debemos utilizar una serie
de mtodos u otros.

You might also like