You are on page 1of 40

Marco Besteiro y Miguel Rodrguez XML.

NET
1/40
XML.NET
XML antes de .NET.
La tecnologa .NET introduce una serie de APIs XML basadas en estndares como
DOM, XPath, XSD (XML Schemas), XSLT y SOAP. Tales APIs estn compuestas por
una serie de clases que pertenecen a varios namespace (siendo el contenedor de todos
Syst em. Xml ) y que hacen ms fcil, flexible e intuitiva la programacin de aplicaciones
con soporte XML.

Estas clases son una evolucin del modelo MSXML 3.0, que es el modelo XML que se
utilizaba en las aplicaciones Microsoft antes de .NET. Los componentes del modelo
XML 3.0 se encuentran en la librera MSXML3. dl l y siguen el estndar DOM.
Aunque lo lgico es utilizar MSXML3. dl l para aplicaciones no .NET y las clases del
namespace Syst em. Xml para aplicaciones .NET, es posible utilizar MSXML3. dl l desde
.NET a travs de la interoperabilidad COM. Es decir, utilizando Tl bi mp se puede crear
una clase wr apper para la librera MSXML3. dl l y luego incluirla en una aplicacin C#.

Por ejemplo:

. . .
. . .
usi ng MSXML3;
DOMDocument 30 docu = new DOMDocument 30( ) ;
i f ( docu. l oad( f i ch1. xml ) )
{
/ / t r at ami ent o del document o
}
. . .
. . .

Al desarrollar aplicaciones .NET, lo ms recomendable es trabajar con las clases del
namespace Syst em. Xml pero existen casos en los que est opcin puede no ser la ms
interesante, como por ejemplo cuando ya se tiene mucho cdigo que no es .NET ya
desarrollado y se quiere reutilizar.
El namespace System.Xml.
Las clases XML del Framework .NET estn repartidas en varios namespace que
pertenecen al namespace Syst em. Xml .

Marco Besteiro y Miguel Rodrguez XML.NET
2/40


Figura 25.1. J erarqua XML en .NET.

Todos estos namespace se encuentran en la librera Syst em. Xml . dl l .
XmlReader.
Es una clase base abstracta que ofrece un cursor de tipo f or war d- onl y, r ead- onl y
(lectura slo hacia delante) para los documentos XML. El hecho de que el cursor sea de
tipo f or war d- onl y hace que sea muy rpido.

Xml Reader permite leer un documento como un stream, sin haberlo cargado
completamente en memoria, del mismo modo que SAX. No como el modelo DOM, que
para leer un documento y procesarlo exige cargarlo previamente en memoria. No
obstante, existe una diferencia importante entre el funcionamiento de Xml Reader y el
modelo SAX:

- Segn el modelo SAX, cuando una aplicacin utiliza un Xml Reader SAX para
leer un documento XML, la aplicacin debe implementar una serie de interfaces
(Lexi cal Handl er , Cont ent Handl er , Er r or Handl er ) a los que va invocando el
Xml Reader segn va leyendo el documento XML. A este modelo se le llama
Model o Push, porque es el Xml Reader el que avisa a la aplicacin.

- Segn el modelo Xml Reader .NET, cuando una aplicacin utiliza un Xml Reader
.NET para leer un documento XML, el objeto Xml Reader debe implementar una
serie de interfaces (Xml Text Reader , Xml Reader , Xml NodeReader ) a las que
invocar la aplicacin cuando desee, siendo la aplicacin la que dispone del
control sobre el avance del parseo o anlisis del documento XML. A este
modelo se le llama Model o Pul l , porque es la aplicacin la que controla al
Xml Reader .

Marco Besteiro y Miguel Rodrguez XML.NET
3/40


Figura 25.2. Model o Push. corresponde a la lectura y parseo de documentos XML
segn el modelo SAX.



Figura 25.3. Model o Pul l . Corresponde a la lectura y parseo de documentos XML
mediante un objeto Xml Reader .NET (que implemente la clase abstracta Xml Reader ).

Varias clases implementan la clase Xml Reader . Las ms significativas son
Xml Text Reader y Xml NodeReader . Xml Text Reader permite leer un stream de tipo
texto (un stream XML es eso, al fin y al cabo) y Xml NodeReader permite trabajar con
un rbol DOM cargado en memoria (correspondiente, por supuesto, a un documento
XML, representado por un objeto de la clase Xml Node).

XmlWriter.
Es una clase base abstracta que define la funcionalidad bsica para generar documentos
XML como streams. La generacin de un documento utilizando Xml Wr i t er .NET es
muy similar a hacerlo mediante la clase Xml Wr i t er SAX.

Xml Wr i t er ofrece mtodos para emitir todas las construcciones del I nf oset estndar en
XML (Wr i t eSt ar t Document , Wr i t eSt ar t El ement , Wr i t eEndDocument ,
Wr i t ePr ocessi ngI nst r uct i on...).

Del mismo modo que ocurre con Xml Reader , varias clases implementan la clase
Xml Wr i t er . stas son Xml Text Wr i t er y Xml NodeWr i t er , similares a sus homnimas
Xml Text Reader y Xml NodeReader pero en sentido opuesto (escritura).

XmlNavigator.
Es una clase base abstracta que define la funcionalidad comn a cualquier navegador de
documentos. Esta clase ofrece un mecanismo genrico de navegacin basado en la
recomendacin XPath 1.0.

Marco Besteiro y Miguel Rodrguez XML.NET
4/40
La clase Xml Navi gat or soporta rutinas de navegacin genricas, seleccin de nodos,
iteracin sobre la seleccin y otras opciones avanzadas sobre la seleccin, como copiar,
borrar, mover, etc...

Una ventaja frente a DOM es que una implementacin de Xml Navi gat or no necesita
cargar un documento completo en memoria para manejar una parte del mismo.

Entre los mtodos ms relevantes ofrecidos por Xml Navi gat or estn Sel ect y
Sel ect Si ngl e, que equivalen a los mtodos sel ect Nodes y sel ect Si ngl eNode de
MSXML 3.0. Ambos mtodos aceptan una expresin XPath bien en forma de st r i ng o
como una expresin precompilada, que ser evaluada para identificar un conjunto de
nodos.
Lectura de documentos XML.
Existen 3 clases derivadas de Xml Reader que permiten leer documentos XML.

- Xml Text Reader , que sigue el modelo pull, que es una variante del modelo push de
SAX.

- Xml NodeReader , que permite leer un documento cargado en memoria, siguiendo el
modelo DOM.

- Xml Val i dat i ngReader que permite validar el documento a leer contra su DTD o su
Schema.


Figura 25.4. Xml Reader y clases que la implementan.

Xml Text Reader , Xml NodeReader y Xml Val i dat i ngReader , implementan los mtodos
declarados por Xml Reader . Xml Reader declara mtodos y propiedades para:

- Leer Nodos (mtodos Read, ReadSt ar t El ement ...).

- Obtener informacin sobre un Nodo (propiedades Name, Local Name,
NameSpaceURI , Val ue, HasAt t r i but es, At t r i but eCount ).

- Expandir referencias a Entidad (mtodo Resol veEnt i t y).

- Moverse y obtener informacin de Atributos (mtodos Get At t r i but e,
MoveToAt t r i but e, MoveToFi r st At t r i but e, MoveToNext At t r i but e)

Marco Besteiro y Miguel Rodrguez XML.NET
5/40
XMLTextReader.
Como ya se ha comentado, Xml Text Reader implementa los mtodos de la clase
Xml Reader y por supuesto, aade nuevos mtodos y propiedades. Xml Text Reader
permite analizar o parsear un stream que contenga un documento de tipo texto XML,
dividindolo en tokens o unidades lxicas que contendrn los distintos elementos del
documento.

El tipo de stream se le pasar como parmetro al constructor. Xml Text Reader tiene
tantos constructores como tipos diferentes de streams soporta (streams simples,
st r i ngs de tipo URI con el nombre y la ruta al fichero, objetos Text Reader ).

Entre las caractersticas nuevas que aade Xml Text Reader cabe destacar:

- Soporte para comprobar que el documento XML est bien formado (en base al
DTD). Xml Text Reader no permite validar el documento, slo comprobar si est
bien formado. Si se desea validar el documento se ha de utilizar
Xml Val i dat i ngReader .

- Soporte para resolucin personalizada de entidades externas: La resolucin
personalizada de entidades externas implica crear una clase derivada de
Xml Resol ver que implemente los mtodos al efecto (y asociarla al
Xml Text Reader mediante la propiedad Xml Resol ver ). Trabajar de este modo
permite mejorar el rendimiento.

Lectura de un documento XML utilizando XmlTextReader.
Una vez se dispone de un objeto Xml Text Reader creado (y por tanto asociado a un
documento XML), para leer el contenido del documento slo hay que invocar al mtodo
Read. El mtodo Read lee un nodo cada vez que es invocado, pero no devuelve el nodo,
sino que deja al objeto Xml Text Reader apuntando al nodo actual tras la lectura. De
este modo, si se desea acceder a la informacin del nodo, habr de ser mediante
mtodos y propiedades del objeto Xml Text Reader (NodeType, Name...).

Cuando se inicializa un objeto Xml Text Reader no hay nodo actual, la primera llamada a
Read sita el objeto Xml Text Reader en el primer nodo del documento y cada nueva
llamada lo va situando en el siguiente nodo.

El orden de lectura de los nodos de un documento XML es de izquierda a derecha y de
arriba hacia abajo.



Marco Besteiro y Miguel Rodrguez XML.NET
6/40
Figura 25.5. Orden de lectura de un documento XML.

El mtodo Read es heredado de Xml Reader e implementado en Xml Text Reader . No es
el nico, y existen varios mtodos ms de lectura heredados de Xml Reader :

- ReadSt ar t El ement : este mtodo permite comprobar en la lectura que el nodo
actual es un elemento con un nombre especfico y una URI especfica. En caso
de que el nodo actual no tenga el nombre y URI pasados como parmetros a
ReadSt ar t El ement se lanzar una excepcin de tipo Xml Except i on.

- ReadSt r i ng: Este mtodo, al leer un nodo de tipo texto, devuelve su contenido
como un st r i ng. Por supuesto, al invocarlo se debe saber de qu tipo es el valor
del nodo actual (el nodo a leer). Si se desea obtener el contenido de un nodo
cuyo tipo sea distinto de st r i ng no existen para ello mtodos del tipo ReadI nt ,
ReadDoubl e, etc.... En su lugar ha de utilizarse la clase Xml Conver t .

Por ejemplo: Doubl e pr eci o = Xml Conver t . ToDoubl e( mi Reader . Read( ) ) ;

- Get At t r i but e: Los mtodos de tipo Read leen los nodos de un documento
XML, pero no los atributos. Si el nodo actual es un elemento, pueden obtenerse
sus atributos invocando al mtodo Get At t r i but e, pasndole como parmetro el
nombre o el ndice del atributo.


En el siguiente ejemplo, se desarrolla una aplicacin de tipo Win Forms llamada
Lect ur aDocsXML1 que consta de una caja de texto t ext Box1, con la propiedad
Mul t i Li ne a t r ue, un botn de pulsacin but t on1, con la propiedad Name = Leer y
una lista l i st Box1 y que, adems,

1) Carga el contenido del fichero l i br os. xml en la caja de texto (en este punto se
utilizan clases de manejo de ficheros, no clases XML).
2) Al pulsar el botn Leer se crea un objeto Xml Text Reader con el que se lee un
stream asociado al fichero l i br os. xml , aadiendo el valor -propiedad Val ue-
de cada Nodo del fichero a la lista.

1) Carga del contenido del fichero l i br os. xml en la caja de texto: Se utilizan las
clases Fi l eSt r eampara abrir el fichero l i br os. xml y St r eamReader para leer
el contenido del fichero. Estas clases pertenecen al namespace Syst em. I O y no
tienen nada que ver con XML. Se utilizan en este ejemplo para cargar el fichero
l i br os. xml en la caja de texto, haciendo ms agradable el ejemplo y mostrando
que, al fin y al cabo, un fichero XML no deja de ser un fichero de texto. El
cdigo para realizar lo comentado puede incluirse en el mtodo For m1_Load,
que es el mtodo que se ejecuta al cargar el formulario de la aplicacin.

...
...
usi ng Syst em. I O;


pr i vat e voi d For m1_Load( obj ect sender , Syst em. Event Ar gs e)
Marco Besteiro y Miguel Rodrguez XML.NET
7/40
{
Fi l eSt r eamf i ch;

f i ch = new Fi l eSt r eam( " . . \ \ . . \ \ l i br os. xml " , Fi l eMode. Open,
Fi l eAccess. Read) ;

St r eamReader st r = new St r eamReader ( f i ch) ;

/ / Si t uar el punt er o de l ect ur a al pr i nci pi o.
st r . BaseSt r eam. Seek( 0, SeekOr i gi n. Begi n) ;

/ / Leer el f i cher o y escr i bi r l o en l a caj a de t ext o.
t ext Box1. Text = st r . ReadToEnd( ) ;
st r . Cl ose( ) ;
}
...
...

El resultado de ejecutar la aplicacin, en este momento, ser:



Figura 25.6. Aplicacin Lect ur aDocsXML1. Carga, mediante lectura tradicional, del
fichero l i br os. xml en la caja de texto.

2) Lectura, utilizando Xml Text Reader , y adicin de los valores de los Nodos a la
lista: para este punto se utiliza un objeto de la clase Xml Text Reader . Al
construirlo se le pasa un objeto Fi l eSt r eam correspondiente al fichero
l i br os. xml . Como puede observarse, la forma de leer un fichero con
Xml Text Reader es similar a la forma de hacerlo con St r eamReader . La
diferencia estriba en la implementacin de la lectura, Xml Text Reader est
especializada para leer documentos XML (a St r eamReader le da igual). El
cdigo correspondiente a este punto ha de escribirse en el mtodo de respuesta al
evento Cl i ck sobre el botn Leer (but t on1).

...
...
usi ng Syst em. I O;
Marco Besteiro y Miguel Rodrguez XML.NET
8/40
usi ng Syst em. Xml ;


pr i vat e voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Fi l eSt r eamf i ch;
f i ch = new Fi l eSt r eam( " . . \ \ . . \ \ l i br os. xml " , Fi l eMode. Open,
Fi l eAccess. Read) ;

Xml Text Reader l ect or 1 = new Xml Text Reader ( f i ch) ;

whi l e ( l ect or 1. Read( ) )
{
l i st Box1. I t ems. Add( l ect or 1. Val ue) ;
}
}
...
...

El resultado de ejecutar la aplicacin, despus de pulsar el botn Leer es:



Figura 25.7. Aplicacin Lect ur aDocsXML1. Lectura, mediante Xml Text Reader , del
documento l i br os. xml .

Como puede observarse, el contenido de la lista no coincide con el contenido de la caja
de texto. El motivo es que, aunque el mtodo Read de Xml Text Reader va leyendo Nodo
a Nodo, la propiedad Val ue slo devuelve lo que se considera es el contenido del nodo.

Por ejemplo: el contenido del nodo <t i t ul o>El Qui j ot e</ t i t ul o> es El Qui j ot e.
En cambio, el contenido del nodo <l i br o gener o=novel a
f echapubl i caci n. . . >. . . </ l i br o> se considera vaco (Val ue devuelve
St r i ng. Empt y), porque contiene otros nodos, no un texto.

A continuacin se muestra una tabla con los tipos de nodo para los que la propiedad
Val ue devuelve un valor. Para el resto de Nodos, devuelve St r i ng. Empt y.

Marco Besteiro y Miguel Rodrguez XML.NET
9/40
Tipo de Nodo Valor devuelto por la propiedad Value
At t r i but e
valor del atributo
CDATASect i on
contenido de la seccin CDATA
Comment
contenido del comentario
Document Type
subconjunto (subset ) interno
Pr ocessi ngI nst r uct i on
contenido completo, excluyendo t ar get
Si gni f i cant Whi t espace
El espacio entre las marcas que lo delimitan (modo
mixto)
Text
contenido del nodo de texto
Whi t espace
El espacio entre las marcas que lo delimitan
Xml Decl ar at i on
contenido de la declaracin

Una posible solucin al problema anterior puede ser mostrar slo aquellos valores que
tengan sentido. En el documento l i br os. xml los nodos para los que Val ue devolver
un valor con sentido son los de tipo Text . Para saber si el Nodo actual es de tipo Text
puede consultarse la propiedad NodeType:

pr i vat e voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Fi l eSt r eamf i ch;

f i ch = new Fi l eSt r eam( " . . \ \ . . \ \ l i br os. xml " , Fi l eMode. Open,
Fi l eAccess. Read) ;

Xml Text Reader l ect or 1 = new Xml Text Reader ( f i ch) ;

whi l e ( l ect or 1. Read( ) )
{
if (lector1.NodeType == XmlNodeType.Text)
l i st Box1. I t ems. Add( l ect or 1. Val ue) ;
}
}

El resultado ahora es:


Marco Besteiro y Miguel Rodrguez XML.NET
10/40

Figura 25.8. Aplicacin Lect ur aDocsXML1. Utilizacin de la propiedad NodeType de
Xml Text Reader para mostrar slo los Nodos de tipo Texto.

Esto ya est algo mejor pero no lo suficiente. Qu sucede con los atributos gener o,
f echapubl i caci n e I SBN?. El mtodo Read lee Nodos, no considera los atributos.
Una solucin es utilizar el mtodo Get At t r i but e cuando el Nodo actual sea <l i br o>:

pr i vat e voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Fi l eSt r eamf i ch;

f i ch = new Fi l eSt r eam( " . . \ \ . . \ \ l i br os. xml " , Fi l eMode. Open,
Fi l eAccess. Read) ;

Xml Text Reader l ect or 1 = new Xml Text Reader ( f i ch) ;

whi l e ( l ect or 1. Read( ) )
{
i f ( l ect or 1. NodeType == Xml NodeType. Text )
l i st Box1. I t ems. Add( l ect or 1. Val ue) ;
el se
{
if (lector1.NodeType == XmlNodeType.Element &
lector1.Name.Equals("libro"))
for(int cont=0; cont<lector1.AttributeCount; cont++)
listBox1.Items.Add(lector1.GetAttribute(cont));
}
}
}

En caso de que el nodo actual no sea de tipo texto, se pregunta si es un elemento
(<l i br o>, <aut or >, <t i t ul o>... son elementos) y si su nombre es l i br o -que es el
que tiene atributos-. En tal caso se obtienen sus atributos y se aaden a la lista
l i st Box1.

El resultado de ejecutar la aplicacin es:


Marco Besteiro y Miguel Rodrguez XML.NET
11/40

Figura 25.9. Aplicacin Lect ur aDocsXML1. Utilizacin de las propiedades NodeType y
Name y del mtodo Get At t r i but e para mostrar tambin los atributos del elemento libro.

Como puede observarse es indispensable conocer bien los tipos de Nodos y cmo
manejarlos para poder analizar de un modo correcto un documento XML.
Nodos XML.
Cuando un parser lee un documento XML, realmente est leyendo sus nodos uno a uno.
Dependiendo del tipo de nodo en el que se est, la informacin que se puede obtener del
nodo es diferente y tambin el tratamiento que se le puede dar.

Como ya se ha visto, la propiedad NodeType ofrece informacin sobre el tipo de nodo
actual al que apunta un Xml Text Reader es decir, un objeto que implemente
Xml Reader -.

NodeType es realmente una enumeracin, cuyos miembros son:

Miembro Descripcin
At t r i but e
Un atributo.
Un nodo de tipo atributo puede tener nodos hijo de tipo Text
o de tipo Ent i t yRef er ence. Un nodo At t r i but e no aparece
como nodo hijo de otro nodo, esto implica que no se
considera nodo hijo de un El ement (elemento).
Ejemplo XML: i d= 123
CDATA
Una seccin CDATA es un nodo que se utiliza para poder
introducir texto sin que sea parseado (de modo que no sea
confundido con marcas XML). En muchos casos se utiliza
para introducir cdigo fuente (scripts...).
Una nodo seccin CDATA puede ser nodo hijo de nodos
Document Fr agment , Ent i t yRef er ence y El ement . Por otro
lado no puede tener nodos hijo.
Ejemplo XML: <! [ CDATA[ t ext o l i br e, aqu puede i r
<< t ext o que f uer a ser a consi der ado mar cas
especi al es] ] >
Comment
Es un comentario.
Una nodo comentario puede ser nodo hijo de nodos
Document , Document Fr agment , Ent i t yRef er ence y
El ement . Por otro lado no puede tener nodos hijo.
Ejemplo XML:
<! - - Est e es el cont eni do de un nodo Comment - - >
Document
Es un nodo Document y representa al documento complete. A
partir de un nodo Document se accede al documento
completo.
Puede tener como nodos hijo:
- El ement
- Pr ocessi ngI nst r uct i on
- Comment
- Document Type
No puede ser nodo hijo.
Marco Besteiro y Miguel Rodrguez XML.NET
12/40
Document Fr agment
En un fragmento de un documento. Asocia un nodo o un
subrbol con un documento.
Puede tener nodos hijo del tipo:
- El ement
- Pr ocessi ngI nst r uct i on
- Comment
- Text
- CDATA
- Ent i t yRef er ence
No puede ser nodo hijo.
Document Type
Es la declaracin del tipo del documento XML, se indica
mediante el tag <! DOCTYPE>.
Un nodo Document Type puede tener nodos hijo del tipo
Not at i on y Ent i t y. Puede ser hijo de un nodo Document .
Ejemplo XML: <! DOCTYPE . . . >
El ement
Es un elemento.
Puede tener nodos hijo del tipo:
- El ement
- Pr ocessi ngI nst r uct i on
- Comment
- Text
- CDATA
- Ent i t yRef er ence
Puede ser nodo hijo de:
- Document
- Document Fr agment
- Ent i t yRef er ence
- El ement
Ejemplo XML: <Li br o>
EndEl ement
Es un tipo de nodo que indica el final de un elemento. Es el
nodo que devuelve Xml Reader cuando se llega al final de un
elemento.
Ejemplo XML: </ Li br o>
EndEnt i t y
Es un tipo de nodo que indica el final de un elemento
(exactamente es el nodo que devuelve Xml Reader cuando se
llega al final de un elemento correspondiente a una entidad
como resultado de una llamada a Resol veEnt i t y.
Ent i t y
Es una declaracin de entidad. Puede tener como nodos hijo
todos aquellos que representen la entidad expandida. Por
ejemplo: Text o, Ent i t yRef er ence...
Puede ser nodo hijo de:
- Document Type
Ejemplo XML:<! ENTI TY Mi Ent i dad. . . >
Ent i t yRef er ence
Es una referencia a una entidad.
Puede tener nodos hijo del tipo:
- El ement
- Pr ocessi ngI nst r uct i on
- Comment
- Text
- CDATA
- Ent i t yRef er ence
Marco Besteiro y Miguel Rodrguez XML.NET
13/40
Puede ser nodo hijo de:
- At t r i but e
- Document Fr agment
- Ent i t yRef er ence
- El ement
Ejemplo XML: &Mi Ent i dad
None
Es lo que devuelve Xml Reader si no ha sido llamado el
mtodo Read.
Not at i on
Es una notacin en la declaracin de tipo de documento.
No puede tener nodos hijo y puede ser hijo del nodo
Document Type.
Ejemplo XML: <! NOTATI ON . . . >
Pr ocessi ngI nst r uct i on
Es una processing instruction (PI ).
No puede tener nodos hijo y puede ser hijo de un nodo:
- Document
- Document Fr agment
- El ement
- Ent i t yRef er ence
Ejemplo XML: <?pi t est ?>
Si gni f i cant Whi t espace
Es un espacio blanco entre marcas en un modelo de
contenido mixto, o un espacio blanco con el mbito XML:
space=pr eser ve.
Text
Es el texto contenido en un elemento.
No puede tener nodos hijo y puede ser hijo de un nodo:
- At t r i but e
- Document Fr agment
- El ement
- Ent i t yRef er ence
Whi t espace
Es un espacio blanco entre marcas
Xml Decl ar at i on
Es un nodo de tipo declaracin XML .
Tiene que ser el primer nodo de un documento. No puede
tener nodos hijo. Es hijo del nodo raz.
Puede tener atributos que indiquen la informacin de versin
o codificacin.
Ejemplo XML: <?xml ver si on= 1. 0 ?>;

Ejemplo: se va a modificar a continuacin la aplicacin Lect ur aDocsXML1, aadindole
un botn Ver Nodos (but t on2), tal que al pulsarlo se muestre en la lista l i st box1 el
tipo (NodeType) y nombre (Name) de todos los nodos del documento l i br os. xml .

El cdigo de but t on2_cl i ck es:

...
...
pr i vat e voi d but t on2_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Fi l eSt r eamf i ch;

f i ch = new Fi l eSt r eam( " . . \ \ . . \ \ l i br os. xml " , Fi l eMode. Open,
Fi l eAccess. Read) ;

Marco Besteiro y Miguel Rodrguez XML.NET
14/40
Xml Text Reader l ect or nodos = new Xml Text Reader ( f i ch) ;

whi l e ( l ect or nodos. Read( ) )
{
l i st Box1. I t ems. Add( l ect or nodos. NodeType + " - - " +
l ect or nodos. Name) ;
}

l ect or nodos. Cl ose( ) ;
f i ch. Cl ose( ) ;
}
...
...

El resultado de ejecutar la aplicacin es:



Figura 25.10. Aplicacin Lect ur aDocsXML1. Utilizacin de las propiedades NodeType y
Name para mostrar la informacin sobre los nodos.

Como puede observarse, los nicos nodos para los que la propiedad Name devuelve un
valor son Xml Decl ar at i on, El ement y EndEl ement . Adems, se saltan los atributos del
nodo de tipo El ement <l i br o> (no aparecen).

XMLNodeReader.
Esta clase permite leer un rbol DOM que contenga un documento XML.
No soporta validacin. Al igual que Xml Text Reader , en caso de querer validar el
documento a leer, se ha de utilizar Xml Val i dat i ngReader .

La principal diferencia con Xml Text Reader es que al constructor de Xml NodeReader ha
de pasrsele un objeto de la clase Xml Document , que representa un documento cargado
en memoria segn el modelo DOM.

Ejemplo: se va a modificar a continuacin la aplicacin Lect ur aDocsXML1, aadindole
un botn Leer DOM (but t on3), tal que al pulsarlo (but t on3_cl i ck) se crear un objeto
Marco Besteiro y Miguel Rodrguez XML.NET
15/40
Xml Document con el contenido de l i br os. xml . Se utilizar un objeto Xml NodeReader
para leer el rbol DOM contenido por Xml Document , mostrando sus nodos en la lista
(completos).

El cdigo de but t on3_cl i ck es:

pr i vat e voi d but t on3_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Xml NodeReader l ect or DOM = nul l ;

t r y
{
/ / cr ear un obj et o Xml Document asoci ado a un f i cher o cuyo
/ / nombr e se pasa en nombr ef i ch y car gar el f i cher o.
Xml Document doc = new Xml Document ( ) ;
doc. Load( " . . \ \ . . \ \ l i br os. xml " ) ;

/ / cr ear un obj et o Xml NodeReader asoci ado al obj et o
/ / Xml Document .
l ect or DOM = new Xml NodeReader ( doc) ;

/ / Anal i zar el document o y most r ar sus nodos.
whi l e ( l ect or DOM. Read( ) )
{
swi t ch ( l ect or DOM. NodeType)
{
case Xml NodeType. El ement :
l i st Box1. I t ems. Add( " <" + l ect or DOM. Name +
" >" ) ;
br eak;
case Xml NodeType. Text :
l i st Box1. I t ems. Add( l ect or DOM. Val ue) ;
br eak;
case Xml NodeType. CDATA:
l i st Box1. I t ems. Add( l ect or DOM. Val ue) ;
br eak;
case Xml NodeType. Pr ocessi ngI nst r uct i on:
l i st Box1. I t ems. Add( " <?" + l ect or DOM. Name
+ " , " + l ect or DOM. Val ue + " ?>" ) ;
br eak;
case Xml NodeType. Comment :
l i st Box1. I t ems. Add( " <! - - " +
l ect or DOM. Val ue + " - - >" ) ;
br eak;
case Xml NodeType. Xml Decl ar at i on:
l i st Box1. I t ems. Add( " <?xml
ver si on=' 1. 0' ?>" ) ;
br eak;
case Xml NodeType. Document :
br eak;
case Xml NodeType. EndEl ement :
l i st Box1. I t ems. Add( " </ " + l ect or DOM. Name
+ " >" ) ;
br eak;
}
}
}
f i nal l y
{
i f ( l ect or DOM! =nul l )
Marco Besteiro y Miguel Rodrguez XML.NET
16/40
l ect or DOM. Cl ose( ) ;
}

}

}

Se ha utilizado una sentencia t r y para controlar el caso de que no se pueda crear el
lector.

El resultado de ejecutar la aplicacin es:



Figura 25.11. Aplicacin Lect ur aDocsXML1. Utilizacin de Xml Document y
Xml NodeReader para mostrar la informacin sobre los nodos.

XmlValidatingReader.
La clase Xml Val i dat i ngReader es similar a Xml Text Reader : la diferencia es que
permite validar un documento XML, adems de analizarlo. De hecho, una de las
sobrecargas del constructor de Xml Val i dat i ngReader recibe como parmetro una
referencia a un objeto Xml Text Reader .

Se puede determinar si validar o no un documento XML estableciendo la propiedad
Val i dat i onType. Los posibles miembros de Val i dat i onType son:

Miembro Descripcin
Aut o
Si existe un DTD o un esquema (XSD o XDR) se utiliza para la
validacin.
DTD
La validacin se hace segn un DTD.
None
No se realiza validacin y no se lanzan, por tanto, errores de
validacin.
Schema
Se valida segn uno o varios esquemas (XSD) que han de haber sido
indicados en la propiedad Schemas.
Marco Besteiro y Miguel Rodrguez XML.NET
17/40
XDR
La validacin se realiza segn esquemas reducidos (XDR).


En caso de realizar validacin, la propiedad Val i dat i onEvent Handl er permite
indicar, mediante un del egat e, el mtodo que manejar los eventos de validacin, es
decir, los errores que se den durante la validacin.

Por ejemplo: se desea crear una aplicacin llamada Val i daci onDocsXml similar a
Lect ur aDocsXml 1 que lea el documento l i br os. xml y muestre su contenido en una
lista. La lectura ha de realizarse con un Xml Val i dat i ngReader , utilizando l i br os. xsd
como schema para la validacin.

El documento de esquema l i br os. xsd ser:

<xsd: schema xml ns: xsd=" ht t p: / / www. w3. or g/ 2001/ XMLSchema"
xmlns="urn:biblioteca-schema"
el ement For mDef aul t =" qual i f i ed"
t ar get Namespace=" ur n: bi bl i ot eca- schema" >

<xsd: el ement name=" bi bl i ot eca" t ype=" Ti pobi bl i ot eca" / >

<xsd: compl exType name=" Ti pobi bl i ot eca" >
<xsd: sequence maxOccur s=" unbounded" >
<xsd: el ement name=" l i br o" t ype=" Ti pol i br o" / >
</ xsd: sequence>
</ xsd: compl exType>

<xsd: compl exType name=" Ti pol i br o" >
<xsd: sequence>
<xsd: el ement name=" t i t ul o" t ype=" xsd: st r i ng" / >
<xsd: el ement name=" aut or " t ype=" Ti poaut or " / >
<xsd: el ement name=" pr eci o" t ype=" xsd: deci mal " / >
</ xsd: sequence>
<xsd: at t r i but e name=" gener o" t ype=" xsd: st r i ng" / >
<xsd: at t r i but e name=" f echapubl i caci on" t ype=" xsd: st r i ng" / >
<xsd: at t r i but e name=" I SBN" t ype=" xsd: st r i ng" / >
</ xsd: compl exType>

<xsd: compl exType name=" Ti poaut or " >
<xsd: sequence>
<xsd: el ement name=" nombr e" t ype=" xsd: st r i ng" / >
<xsd: el ement name=" apel l i do" t ype=" xsd: st r i ng" / >
</ xsd: sequence>
</ xsd: compl exType>

</ xsd: schema>

La lnea xmlns="urn:biblioteca-schema" implica que el documento l i br os. xml
tiene que incluirla para no tener un conflicto de nombres con l i br os. xsd. Es
simplemente una mejora; recuerde los espacios de nombres en XML:

<?xml ver si on=' 1. 0' ?>
<bi bl i ot eca xmlns="urn:biblioteca-schema">
<l i br o gener o=" novel a" f echapubl i caci on=" 1981" I SBN=" 1- 871783-
11- 9" >
<t i t ul o>El Qui j ot e</ t i t ul o>
. . .
Marco Besteiro y Miguel Rodrguez XML.NET
18/40
. . .

El cdigo del mtodo but t on1_Cl i ck, que es donde se realizar el anlisis validante
del documento l i br os. xml , es:

pr i vat e voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Fi l eSt r eamf i ch;
f i ch = new Fi l eSt r eam( " . . \ \ . . \ \ l i br os. xml " , Fi l eMode. Open,
Fi l eAccess. Read) ;

Xml Text Reader l ect or 1 = new Xml Text Reader ( f i ch) ;

/ / Cr eaci n del obj et o de t i po Xml Val i dat i ngReader
/ / a par t i r del Xml Text Reader
XmlValidatingReader lector1_val= new
XmlValidatingReader(lector1);

/ / Adi ci n de l i br os. xsd a l a col ecci n Schemas de l ect or 1_val
/ / l i br os. xsd ser el esquema ut i l i zado par a val i dar
lector1_val.Schemas.Add(null, "..\\..\\libros.xsd");
/ / El ecci n de Schema como t i po de val i daci n
lector1_val.ValidationType = ValidationType.Schema;
/ / El mt odo manej ador de l os er r or es de val i daci n
/ / ser Manej ador Val i daci on
lector1_val.ValidationEventHandler += new ValidationEventHandler
(ManejadorValidacion);

whi l e ( l ect or 1_val . Read( ) )
{
i f ( l ect or 1_val . NodeType == Xml NodeType. Text )
l i st Box1. I t ems. Add( l ect or 1_val . Val ue) ;
el se
{
i f ( l ect or 1_val . NodeType == Xml NodeType. El ement &
l ect or 1_val . Name. Equal s( " l i br o" ) )
f or ( i nt cont =0; cont <l ect or 1_val . At t r i but eCount ;
cont ++)
l i st Box1. I t ems. Add( l ect or 1_val . Get At t r i but e( cont ) ) ;
}
}
l ect or 1. Cl ose( ) ;
f i ch. Cl ose( ) ;
}

Es importante observar que la propiedad Schemas es una coleccin a la que se aaden
las rutas de los diferentes esquemas -pueden ser varios- que se desean utilizar para la
validacin.

La propiedad Val i dat i onEvent Handl er indica el mtodo manejador de los eventos
que se den durante la validacin, el cdigo de este mtodo es:

publ i c st at i c voi d Manej ador Val i daci on ( obj ect sender ,
Val i dat i onEvent Ar gs ar gs)
{
MessageBox. Show( ar gs. Message) ;
}

Marco Besteiro y Miguel Rodrguez XML.NET
19/40
El resultado de ejecutar la aplicacin y pulsar el botn Leer (but t on1) es:



Figura 25.12. Utilizacin de Xml Val i dat i ngReader con un documento XML correcto.

Si se observa el contenido del documento l i br os. xml en la caja de texto, en la parte
izquierda, puede verse el aadido

xml ns=ur n: bi bl i ot eca- schema.

Por lo dems, parece que todo ha ido bien y as es, ya que el documento l i br os. xml es
correcto segn l i br os. xsd.

Para apreciar la validacin es una buena ayuda ver el resultado de un error durante la
misma. Para conseguirlo, basta con hacer incorrecto el documento l i br os. xml . Por
ejemplo, puede eliminarse el elemento apel l i do del primer <l i br o> en el documento
l i br os. xml (l i br os_er r or . xml ):

<?xml ver si on=' 1. 0' ?>
<bi bl i ot eca xml ns=" ur n: bi bl i ot eca- schema" >
<l i br o gener o=" novel a" f echapubl i caci on=" 1981" I SBN=" 1- 871783-
11- 9" >
<t i t ul o>El Qui j ot e</ t i t ul o>
<autor>
<nombre>Miguel</nombre>
</autor>
<pr eci o>12. 25</ pr eci o>
. . .
. . .

Marco Besteiro y Miguel Rodrguez XML.NET
20/40


Figura 25.13. Utilizacin de Xml Val i dat i ngReader con un documento XML errneo.

Escritura de documentos XML.
Existen dos clases derivadas de Xml Wr i t er , que permiten escribir documentos XML:

- Xml Text Wr i t er , que es la inversa de Xml Text Reader . Permite escribir texto
XML a un stream, a un fichero o a un objeto de la clase Text Wr i t er .

- Xml NodeWr i t er , que permite escribir texto XML a un stream asociado a un
rbol DOM contenido en memoria.


Figura 25.14. Xml Wr i t er y clases que la implementan.

Los mtodos ms significativos de Xml Text Wr i t er son los de tipo Wr i t eXXX:

- Wr i t eSt ar t Document : escribe la declaracin de documento XML. Por ejemplo:
<?xml ver si n=1. 0>.

- Wr i t eEndDocument : cierra todos los elementos y atributos abiertos y sita el
puntero de escritura al principio.

- Wr i t eSt ar t El ement y Wr i t eEndEl ement permiten escribir el comienzo y el
final de un elemento. Wr i t eEndEl ement no necesita que se le pase el elemento
como parmetro, escribe el que corresponda cerrar.
Marco Besteiro y Miguel Rodrguez XML.NET
21/40
- Wr i t eEl ement St r i ng: escribe un elemento que contiene un valor de tipo
st r i ng. Equivale a llamar a Wr i t eSt ar t El ement , Wr i t eSt r i ng y
Wr i t eEndEl ement .

- Wr i t eAt t r i but es: escribe todos los atributos que obtenga del Nodo actual en el
objeto Xml Reader cuya referencia recibe como primer parmetro.

- Wr i t eAt t r i but eSt r i ng: escribe un atributo y su valor. Se deben pasar como
parmetros.

- Wr i t eSt r i ng: escribe un st r i ng.

- Wr i t eCDat a: escribe un bloque <! [ CDATA[ . . . ] ] > que contiene el texto que se
le pasa como parmetro.

- Wr i t eComment : escribe un comentario (<! - - . . . - - >) con el texto que se le pasa
como parmetro.

- Wr i t eNode: escribe el Nodo actual del Xml Reader que recibe como parmetro y
avanza el Xml Reader al siguiente Nodo.


XMLTextWriter.
Los mtodos explicados de Xml Wr i t er no estn todos implementados en la propia clase
Xml Wr i t er , ya que es abstracta. Xml Text Wr i t er implementa todos los mtodos no
implementados de Xml Wr i t er .

Xml Text Wr i t er permite escribir texto XML a un stream de modo no cacheado y
escritura slo hacia delante (f or war d- onl y), lo cual le da gran rapidez.

El constructor de Xml Text Wr i t er est sobrecargado. Las posibles opciones son:

- publ i c Xml Text Wr i t er ( Text Wr i t er )
La escritura se hace a travs de un objeto de la clase Text Wr i t er , que puede estar
asociado a un fichero, etc...

- publ i c Xml Text Wr i t er ( St r eam, Encodi ng)
La escritura se hace a travs de un objeto de la clase St r eam, que puede estar asociado a
un fichero, etc... Encodi ng indica la codificacin utilizada para el texto (UTF- 8, UTF-
16...).

- publ i c Xml Text Wr i t er ( St r eam, Encodi ng)
La escritura se hace a un fichero cuyo nombre y ruta se indica en el primer parmetro.

Por ejemplo: se desea construir una aplicacin que, al pulsar un botn Gener ar Xml ,
genere un fichero llamado l i br osgen. xml cuyo contenido sern tres libros (igual que
el fichero l i br os. xml de los ejemplos anteriores).

Marco Besteiro y Miguel Rodrguez XML.NET
22/40
El cdigo del mtodo de respuesta al evento Cl i ck sobre el botn Gener ar Xml
(but t on1_cl i ck) es:

pr i vat e voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
/ / Cr eaci n del obj et o Xml Text Wr i t er
Xml Text Wr i t er escr i t or =
new Xml Text Wr i t er ( " . . \ \ . . \ \ l i br osgen. xml " , nul l ) ;

/ / Hacer que el f or mat o sea i ndent ado, es deci r ,
/ / con t abul aci ones.
escr i t or . For mat t i ng = For mat t i ng. I ndent ed;

/ / escr i bi r el comoenzo del document o
/ / <?xml ver si on=" 1. 0" >
escr i t or . Wr i t eSt ar t Document ( ) ;

/ / comi enzo del el ement o <bi bl i ot eca>
escr i t or . Wr i t eSt ar t El ement ( " bi bl i ot eca" ) ;

/ / pr i mer l i br o
/ / comi enzo del el ement o <l i br o>
escr i t or . Wr i t eSt ar t El ement ( " l i br o" ) ;

/ / at r i but os del el ement o <l i br o>
escr i t or . Wr i t eAt t r i but eSt r i ng( " gener o" , " novel a" ) ;
escr i t or . Wr i t eAt t r i but eSt r i ng( " f echapubl i caci on" , " 1981" ) ;
escr i t or . Wr i t eAt t r i but eSt r i ng( " I SBN" , " 1- 871783- 11- 9" ) ;

/ / el ement o <t i t ul o>
escr i t or . Wr i t eEl ement St r i ng( " t i t ul o" , " El Qui j ot e" ) ;

/ / comi enzo del el ement o <aut or >
escr i t or . Wr i t eSt ar t El ement ( " aut or " ) ;

/ / el ement o <nombr e>
escr i t or . Wr i t eEl ement St r i ng( " nombr e" , " Mi guel " ) ;

/ / el ement o <apel l i do>
escr i t or . Wr i t eEl ement St r i ng( " apel l i do" , " de Cer vant es" ) ;

/ / f i nal del el ement o <aut or >
escr i t or . Wr i t eEndEl ement ( ) ;

/ / el ement o <pr eci o>
escr i t or . Wr i t eEl ement St r i ng( " pr eci o" , " 12. 25" ) ;

/ / f i nal del el ement o <l i br o>
escr i t or . Wr i t eEndEl ement ( ) ;

/ / segundo l i br o
/ / comi enzo del el ement o <l i br o>
escr i t or . Wr i t eSt ar t El ement ( " l i br o" ) ;

/ / at r i but os del el ement o <l i br o>
escr i t or . Wr i t eAt t r i but eSt r i ng( " gener o" , " novel a" ) ;
escr i t or . Wr i t eAt t r i but eSt r i ng( " f echapubl i caci on" , " 1999" ) ;
escr i t or . Wr i t eAt t r i but eSt r i ng( " I SBN" , " 0- 801- 53391- 5" ) ;

/ / el ement o <t i t ul o>
escr i t or . Wr i t eEl ement St r i ng( " t i t ul o" , " Ci en aos de sol edad" ) ;
Marco Besteiro y Miguel Rodrguez XML.NET
23/40

/ / comi enzo del el ement o <aut or >
escr i t or . Wr i t eSt ar t El ement ( " aut or " ) ;

/ / el ement o <nombr e>
escr i t or . Wr i t eEl ement St r i ng( " nombr e" , " Gabr i el " ) ;

/ / el ement o <apel l i do>
escr i t or . Wr i t eEl ement St r i ng( " apel l i do" , " Gar ci a Mar quez" ) ;

/ / f i nal del el ement o <aut or >
escr i t or . Wr i t eEndEl ement ( ) ;

/ / el ement o <pr eci o>
escr i t or . Wr i t eEl ement St r i ng( " pr eci o" , " 10. 5" ) ;

/ / f i nal del el ement o <l i br o>
escr i t or . Wr i t eEndEl ement ( ) ;

/ / t er cer l i br o
/ / comi enzo del el ement o <l i br o>
escr i t or . Wr i t eSt ar t El ement ( " l i br o" ) ;

/ / at r i but os del el ement o <l i br o>
escr i t or . Wr i t eAt t r i but eSt r i ng( " gener o" , " novel a" ) ;
escr i t or . Wr i t eAt t r i but eSt r i ng( " f echapubl i caci on" , " 1991" ) ;
escr i t or . Wr i t eAt t r i but eSt r i ng( " I SBN" , " 1- 881501- 87- 3" ) ;

/ / el ement o <t i t ul o>
escr i t or . Wr i t eEl ement St r i ng( " t i t ul o" , " Ri mas" ) ;

/ / comi enzo del el ement o <aut or >
escr i t or . Wr i t eSt ar t El ement ( " aut or " ) ;

/ / el ement o <nombr e>
escr i t or . Wr i t eEl ement St r i ng( " nombr e" , " Gust avo Adol f o" ) ;

/ / el ement o <apel l i do>
escr i t or . Wr i t eEl ement St r i ng( " apel l i do" , " Becquer " ) ;

/ / f i nal del el ement o <aut or >
escr i t or . Wr i t eEndEl ement ( ) ;

/ / el ement o <pr eci o>
escr i t or . Wr i t eEl ement St r i ng( " pr eci o" , " 9. 75" ) ;

/ / f i nal del el ement o <l i br o>
escr i t or . Wr i t eEndEl ement ( ) ;

/ / f i nal del el ement o <bi bl i ot eca>
escr i t or . Wr i t eEndEl ement ( ) ;

/ / f i nal del document o
escr i t or . Wr i t eEndDocument ( ) ;

/ / vaci ar el buf f er del escr i t or
escr i t or . Fl ush( ) ;

/ / cer r ar el st r eam
escr i t or . Cl ose( ) ;
}
Marco Besteiro y Miguel Rodrguez XML.NET
24/40


Aunque es largo, realmente es repetitivo, pues se generan tres elementos libro, donde lo
nico que cambia son los datos.




Figura 25.15. Formulario de la aplicacin Gener ar DocsXml .

Al ejecutar la aplicacin y pulsar el botn Gener ar Xml , se genera, en la carpeta
Gener ar DocsXml , el fichero l i br osgen. xml .


Marco Besteiro y Miguel Rodrguez XML.NET
25/40

Figura 25.16. l i br osgen. xml .

Implementacin de DOM en .NET.
En el namespace Syst em. Xml existen clases que implementan el modelo DOM ( el
nivel 1 completo y el ncleo del nivel 2).

La ms importante es Xml Node, es una clase abstracta que representa un nodo de un
documento XML. De esta clase derivan prcticamente todas las dems del modelo
DOM, a excepcin de Xml NodeLi st , que representa una lista o coleccin ordenada de
nodos, Xml I mpl ement at i on, que define el contexto para un conjunto de objetos
Xml Document y Xml NamedNodeMap, que representa una coleccin de nodos que pueden
ser accedidos mediante un nombre o un ndice.
























Figura 25.17. J erarqua de clases del modelo DOM en .NET

Xml Document representa un documento XML completo. De esta clase deriva
Xml Dat aDocument , que representa un documento cuyos datos pueden ser almacenados,
extrados y manejados mediante un Dat aSet . Xml Dat aDocument representa la unin de
XML y ADO.

Xml El ement representa un elemento XML y Xml At t r i but e representa un atributo
dentro de un objeto de la clase Xml El ement .

Marco Besteiro y Miguel Rodrguez XML.NET
26/40
El resto de tipos de nodos XML tienen sus respectivas clases, como son Xml Not at i on,
Xml Ent i t y, Xml Document Fr agment -que representa un fragmento de un rbol DOM
correspondiente a un documento- y las clases derivadas de Xml Li nkedNode, como son
Xml Decl ar at i on, que representa una declaracin en un documento XML ( <?xml
ver si n= 1. 0 . . . >), Xml Char act er Dat a -y sus derivadas, como
Xml CDat aSect i on...-, Xml Pr ocessi ngI nst r uct i on, etc...

Es importante resear que Xml Li nkedNode -y sus derivadas- permite obtener el nodo
inmediatamente anterior -propiedad Pr evi ousSi bl i ng- o posterior -propiedad
Next Si bl i ng- al actual.

La diferencia fundamental entre utilizar el modelo DOM o las clases derivadas de
Xml Reader y Xml Wr i t er es que con el modelo DOM, el documento XML se encuentra
cargado completamente en memoria, pudiendo acceder a sus nodos en el orden que se
quiera. En cambio, mediante las clase derivadas de Xml Reader y Xml Wr i t er no se
dispone del documento XML cargado completamente, sino de un cursor asociado a un
stream que slo permite ir leyendo el documento XML asociado nodo a nodo hacia
delante, sin posibilidad de acceder a nodos anteriores una vez pasados.

Esto hace ver una ventaja en el modelo DOM, que es la disponibilidad del documento
completo, pero tambin muestra una desventaja, que es la necesidad de ocupar ms
memoria que simplemente leyendo el documento nodo a nodo hacia delante.

Si lo que se desea es leer o generar un documento XML directamente, en una sola
pasada, es mejor utilizar clases derivadas de Xml Reader y Xml Wr i t er .

Si lo que se desea es disponer de un documento en memoria (ya sea para leer sus nodos
o generarlos) pudiendo moverse entre los nodos hacia delante y atrs y modificarlos o
insertar nuevos nodos, es mejor utilizar el modelo DOM.

Lectura de un documento XML utilizando el modelo DOM.
Para leer un documento XML, lo primero que se ha de hacer es crear un objeto
Xml Document asociado al documento y cargarlo, invocando al mtodo Load.

Tras este ltimo paso se dispondr del rbol DOM correspondiente al documento
cargado en memoria, con todos sus nodos disponibles, pudiendo utilizar los mtodos de
la clase Xml Document para obtener los nodos. Los ms importantes son:

- Fi r st Chi l d: devuelve un objeto Xml Node con el nodo raz del documento.

- Last Chi l d: devuelve un objeto Xml Node con el ltimo nodo.

- Chi l dNodes: devuelve una lista (Xml NodeLi st ) con todos los nodos.

- Get El ement sByTagName: devuelve una lista (Xml NodeLi st ) con todos los nodos
correspondientes el elemento que se le pasa como primer parmetro al mtodo.

- Por ejemplo:
Marco Besteiro y Miguel Rodrguez XML.NET
27/40

Xml Document docxml = new Xml Document ( ) ;
docxml . Load( . . \ \ . . \ \ l i br os. xml ) ;
Xml NodeLi st l i st aNodos = docxml . Get El ement sByTagName( aut or ) ;

- Sel ect Si ngl eNode: selecciona y devuelve el nodo cuyo nombre se le pasa
como parmetro.

Todos estos mtodos son heredados por Xml Document de Xml Node, de lo cual se deduce
que cualquier nodo o lista de nodos devuelta por estos mtodos los soporta. Es decir,
una vez se haya obtenido el nodo raz de un objeto Xml Document puede invocarse sobre
el objeto Xml Node correspondiente al nodo raz a cualquiera de los mtodos anteriores
para obtener sus nodos hijos.

A continuacin se muestra mediante una sencilla aplicacin de consola como utilizar
Xml Document y Xml Node para cargar un documento XML a partir de un st r i ng con
formato XML y mostrar sus nodos por la consola.

usi ng Syst em;
usi ng Syst em. I O;
usi ng Syst em. Xml ;

publ i c cl ass Lect ur aDOMDocXml
{
publ i c st at i c voi d Mai n( )
{

Xml Document docxml = new Xml Document ( ) ;
docxml . LoadXml ( " <book I SBN=' 1- 861001- 57- 5' >" +
" <t i t l e>Pr i de And Pr ej udi ce</ t i t l e>" +
" <pr i ce>19. 95</ pr i ce>" +
" </ book>" ) ;

/ / El pr i mer nodo hi j o del document o es <book. . . >
Xml Node nodor ai z = docxml . Fi r st Chi l d;


i f ( nodor ai z. HasChi l dNodes)
{
/ / Recor r er l os nodos hi j o y most r ar su cont eni do
f or ( i nt i =0; i < nodor ai z. Chi l dNodes. Count ; i ++)
{
Consol e. Wr i t eLi ne( nodor ai z. Chi l dNodes[ i ] . I nner Text ) ;
}
}
}
}

Este ejemplo ilustra el uso de Xml Document y Xml Node, pero no las ventajas que ofrece
el modelo DOM.

Un ejemplo ms adecuado para tal fin puede ser una aplicacin que ofrezca, a partir de
un documento XML -por ejemplo, l i br os. xml - una lista con todos los ttulos de los
libros, de modo que al seleccionar uno, se muestre en una caja de texto toda su
informacin. El hecho de implementar este ejemplo con un objeto de una clase derivada
de Xml Reader como por ejemplo, Xml Text Reader - obligara a leer secuencialmente,
Marco Besteiro y Miguel Rodrguez XML.NET
28/40
desde el principio, el documento l i br os. xml cada vez que se elija un ttulo anterior al
ltimo elegido. As la solucin ms acertada en este caso es utilizar el modelo DOM.

El cdigo para cargar los ttulos de los libros en la lista puede ejecutarse al cargar el
formulario.

...
...
/ / cr eaci n del document o xml vac o
pr i vat e Xml Document docxml = new Xml Document ( ) ;
...
...
pr i vat e voi d For m1_Load( obj ect sender , Syst em. Event Ar gs e)
{
/ / car gar el document o en memor i a
/ / Se cr ea el r bol DOM cor r espondi ent e al document o
docxml . Load( " . . \ \ . . \ \ l i br os. xml " ) ;

/ / obt enci n del el ement o r a z del document o
/ / en est e caso es <bi bl i ot eca>
Xml Node nodor ai z = docxml . Document El ement ;

/ / El nodo cor r espondi ent e al el ement o <bi bl i ot eca>
/ / t i ene 3 nodos hi j os de t i po <l i br o>
i f ( nodor ai z. HasChi l dNodes)
{
/ / Recor r er l os nodos y aadi r l os t t ul os a l a l i st a
f or ( i nt i =0; i <nodor ai z. Chi l dNodes. Count ; i ++)
{
/ / sel ecci n del nodo deseado, no es necesar i o
/ / pasar por l os dems.
Xml Node nodol i br o = nodor ai z. Chi l dNodes[ i ] ;
Xml Node nodot i t ul o = nodol i br o. Chi l dNodes[ 0] ;
l i st Box1. I t ems. Add( nodot i t ul o. I nner Text ) ;
}
}
}

Puede observarse que se ha utilizado la propiedad Document El ement para obtener el
nodo raz del documento. Esto es as porque la propiedad Fi r st Chi l d devuelve el
primer nodo del documento, que en este caso es <?xml ver si n= 1. 0 ?> y no el
nodo raz <bi bl i ot eca>, cuyos nodos hijos son los nodos <l i br o>.

El cdigo del mtodo de respuesta al evento Cl i ck sobre la lista es:

pr i vat e voi d l i st Box1_Sel ect edI ndexChanged( obj ect sender ,
Syst em. Event Ar gs e)
{
/ / Sel ecci n del nodo cor r espondi ent e al l i br o cuyo t t ul o
/ / ha si do sel ecci onado en l a l i st a
/ / l a cadena de sel ecci n es una expr esi n XPat h
Xml Node nodo =
docxml . Sel ect Si ngl eNode( " bi bl i ot eca/ l i br o[ t i t ul o=' " +
l i st Box1. Sel ect edI t em. ToSt r i ng( ) + " ' ] " ) ;

/ / most r ar l os at r i but os, par a el l o se ut i l i za l a col ecci n
/ / At t r i but es
Marco Besteiro y Miguel Rodrguez XML.NET
29/40
t ext Box1. Text = nodo. At t r i but es[ " gener o" ] . I nner Text ;
t ext Box2. Text = nodo. At t r i but es[ " f echapubl i caci on" ] . I nner Text ;
t ext Box3. Text = nodo. At t r i but es[ " I SBN" ] . I nner Text ;

/ / most r ar el t t ul o.
/ / ot r o modo: nodo. Sel ect Si ngl eNode( " t i t ul o" ) . I nner Text
t ext Box4. Text = nodo. Fi r st Chi l d. I nner Text ;

/ / most r ar el nombr e
t ext Box5. Text = nodo. Sel ect Si ngl eNode( " aut or / nombr e" ) . I nner Text ;

/ / most r ar el apel l i do
t ext Box6. Text =
nodo. Sel ect Si ngl eNode( " aut or / apel l i do" ) . I nner Text ;

/ / most r ar el pr eci o
t ext Box7. Text = nodo. Sel ect Si ngl eNode( " pr eci o" ) . I nner Text ;
}

Aunque se explica mediante comentarios es importante observar el st r i ng que se pasa
como parmetro a Sel ect Si ngl eNode. Es una expresin de tipo XPath que permite
refinar la bsqueda del nodo deseado. El concepto es muy parecido al de un path o ruta
a un fichero.

Tambin es importante la propiedad I nner Text , que devuelve el contenido (texto) de
un nodo, ya sea dicho nodo correspondiente a un elemento, un atributo...

Una propiedad similar es I nner Xml que devuelve el contenido XML del nodo.

Por otro lado, la coleccin At t r i but es contiene los distintos atributos para un nodo
dado.

El resultado de ejecutar la aplicacin y elegir un elemento de la lista es el de la figura
25.18.

Marco Besteiro y Miguel Rodrguez XML.NET
30/40


Figura 25.18. Cada vez que se selecciona un ttulo en la lista, se accede directamente al
mismo -al rbol DOM cargado en memoria-, mostrando su informacin en la caja de
texto.

Modificacin de un documento XML utilizando el modelo DOM.
Del mismo modo que es posible acceder directamente a un nodo y despus obtener su
contenido -I nner Text , Chi l dNodes, Fi r st Chi l d, I nner Xml ...- tambin es posible
modificar su contenido.

Por ejemplo, suponga que en el ejemplo anterior se desea acceder al nodo
correspondiente al libro seleccionado en la lista y modificar su atributo gener o con el
contenido de la caja de texto en la que se indica el gnero (t ext Box1), el cdigo es:

/ / Sel ecci n del nodo cor r espondi ent e al l i br o cuyo t t ul o
/ / ha si do sel ecci onado en l a l i st a
/ / l a cadena de sel ecci n es una expr esi n XPat h
Xml Node nodo = docxml . Sel ect Si ngl eNode( " bi bl i ot eca/ l i br o[ t i t ul o=' " +
l i st Box1. Sel ect edI t em. ToSt r i ng( ) + " ' ] " ) ;

/ / act ual i zar el at r i but o gener o
nodo. At t r i but es[ " gener o" ] . I nner Xml = t ext Box1. Text ;

Si adems se desea -utilizando el contenido de t ext Box4- modificar el ttulo:

/ / act ual i zar el t t ul o en el nodo
nodol i br o. Sel ect Si ngl eNode( " t i t ul o" ) . I nner Text = t ext Box4. Text ;

Marco Besteiro y Miguel Rodrguez XML.NET
31/40
Como se puede observar, modificar el contenido de un nodo implica simplemente
asignar a sus propiedades los valores deseados. No obstante, existen varios caminos
diferentes para realizar operaciones sobre los nodos de un documento XML.

Aprovechando el ejemplo anterior, se va a aadir un botn Act ual i zar a la aplicacin
AccesoDOMXml que, al ser pulsado, actualice el nodo correspondiente al ttulo
seleccionado en la lista (l i st Box1) con el contenido de las cajas de texto.
El cdigo asociado al mtodo de respuesta al evento Cl i ck sobre el botn Act ual i zar
ser:

pr i vat e voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
/ / Sel ecci n del nodo cor r espondi ent e al l i br o cuyo t t ul o
/ / ha si do sel ecci onado en l a l i st a
/ / l a cadena de sel ecci n es una expr esi n XPat h
Xml Node nodol i br o =
docxml . Sel ect Si ngl eNode( " bi bl i ot eca/ l i br o[ t i t ul o=' " +
l i st Box1. Sel ect edI t em. ToSt r i ng( ) + " ' ] " ) ;

/ / act ual i zar el nodo en el r bol DOM
t hi s. Act ual i zar ( nodol i br o) ;

/ / act ual i zar el t t ul o en l a l i st a
l i st Box1. I t ems[ l i st Box1. Sel ect edI ndex] = t ext Box4. Text ;
}

El cdigo de actualizacin est en el mtodo Act ual i zar . Se ha hecho as porque es
una operacin que puede ser reutilizada por otras operaciones que se aadan
posteriormente.

pr i vat e voi d Act ual i zar ( Xml Node nodol i br o)
{
/ / act ual i zar l os at r i but os del nodo
nodol i br o. At t r i but es[ " gener o" ] . I nner Xml = t ext Box1. Text ;
nodol i br o. At t r i but es[ " f echapubl i caci on" ] . I nner Xml =
t ext Box2. Text ;
nodol i br o. At t r i but es[ " I SBN" ] . I nner Xml = t ext Box3. Text ;

/ / act ual i zar el t t ul o en el nodo
nodol i br o. Sel ect Si ngl eNode( " t i t ul o" ) . I nner Text = t ext Box4. Text ;

/ / act ual i zar el nombr e y el r est o de nodos hi j o del nodo <l i br o>
/ / sel ecci onado en l a l i st a
nodol i br o. Sel ect Si ngl eNode( " aut or / nombr e" ) . I nner Text =
t ext Box5. Text ;
nodol i br o. Sel ect Si ngl eNode( " aut or / apel l i do" ) . I nner Text =
t ext Box6. Text ;

nodol i br o. Sel ect Si ngl eNode( " pr eci o" ) . I nner Text = t ext Box7. Text ;
}

A continuacin se muestra el resultado de ejecutar la aplicacin. Al pulsar el botn
Act ual i zar , el contenido de las cajas de texto es utilizado para actualizar el nodo cuyo
ttulo est seleccionado en la lista. Puede comprobarse seleccionando otro ttulo y
volviendo al correspondiente al nodo cambiado. Esta actualizacin se hace en el rbol
Marco Besteiro y Miguel Rodrguez XML.NET
32/40
DOM en memoria, no en el fichero. Para actualizar el fichero se ha de utilizar el mtodo
Save de Xml Document , como se explica ms adelante.



Figura 25.19. Actualizacin del contenido de un nodo del rbol DOM. La primera parte
del Quijote se public en 1604 y la segunda en 1615 -la de 1614 era falsa-. Claro que
podra estarse hablando de cualquier edicin hasta el da de hoy. Como ejercicio pueden
corregirse el resto de datos.

Generacin e insercin de nuevos nodos utilizando el modelo
DOM.
Antes de poder insertar un nodo en un rbol DOM se debe crear, lo cual no puede
hacerse instanciando la clase Xml Node, porque es abstracta. Tampoco sus derivadas
(Xml El ement , Xml At t r i but e, etc...), ya que no se permite porque no se puede acceder a
sus constructores.

Para crear un nodo se han de utilizar los mtodos que ofrece la clase Xml Document :

- Cr eat eNode: este mtodo crea un nodo, permitiendo una de sus sobrecargas
indicar el tipo (Xml NodeType), el nombre y la URI de su namespace.

- Cr eat eEl ement : es una variante de Cr eat eNode que permite crear un nodo cuyo
tipo es Xml El ement .

- Cr eat eAt t r i but e: permite crear un nodo de tipo atributo.

Marco Besteiro y Miguel Rodrguez XML.NET
33/40
- Adems de estos tres mtodos, la clase Xml Document tiene otros muchos como
Cr eat ePr ocessi ngI nst r uct i on, Cr eat eCDat aSect i on, Cr eat eComment ,
Cr eat eEnt i t yRef er ence....

A continuacin se muestra un ejemplo de cmo crear un nuevo nodo de tipo El ement
<l i br o> y otro de tipo At t r i but e gener o.

/ / cr eaci n del document o xml vac o
pr i vat e Xml Document docxml = new Xml Document ( ) ;

/ / car gar el document o en memor i a
/ / Se cr ea el r bol DOM cor r espondi ent e al document o
docxml . Load( " . . \ \ . . \ \ l i br os. xml " ) ;

/ / Cr ear un nodo nuevo de t i po El ement <l i br o>.
Xml Node nodol i br o = docxml . Cr eat eEl ement ( " l i br o" ) ;

/ / Cr eaci n de un nodo nuevo de t i po At t r i but e <gener o>
Xml At t r i but e at r i but o =docxml . Cr eat eAt t r i but e( " gener o" ) ;
. . .
. . .

El nodo libro creado es simplemente un nodo vaco y no tiene una posicin determinada
en el rbol DOM referenciado por docxml . Para poder insertar tal nodo en el rbol
DOM habr que aadirle todos los atributos y nodos hijo que le faltan.

Otro modo de aadir un nuevo nodo a un rbol DOM ya existente es duplicar un nodo
perteneciente al rbol -de igual estructura, evidentemente- utilizando el mtodo
Cl oneNode de la clase Xml Document . Tambin existe este mtodo en la clase Xml Node
y derivadas.

La clase Xml Node -y sus derivadas- permite insertar nodos en un rbol DOM mediante
los mtodos I nser t Af t er , I nser t Bef or e y AppendChi l d.

- I nser t Af t er : recibe como parmetro un nodo y lo inserta despus del nodo actual.

- I nser t Bef or e: recibe como parmetro un nodo y lo inserta antes del nodo actual.

- AppendChi l d: recibe como parmetro un nodo y lo inserta despus del ltimo nodo
(al final del rbol DOM).

Ejemplo. A continuacin se muestra cmo insertar el nodo nodol i br o en el rbol DOM
referenciado por docxml .

/ / Sel ecci n del nodo cor r espondi ent e al l i br o cuyo t t ul o
/ / ha si do sel ecci onado en l a l i st a
/ / l a cadena de sel ecci n es una expr esi n XPat h
Xml Node nodol i br oact ual =
docxml . Sel ect Si ngl eNode( " bi bl i ot eca/ l i br o[ t i t ul o=' " +
l i st Box1. Sel ect edI t em. ToSt r i ng( ) + " ' ] " ) ;

/ / obt enci n del nodo r a z del dr bol DOM
Xml Node nodor ai z = docxml . Document El ement ;

Marco Besteiro y Miguel Rodrguez XML.NET
34/40
/ / i nser ci n del nodo nuevo en el r bol DOM
/ / j ust o det r s del act ual
nodor ai z. I nser t Af t er ( nodol i br o, nodol i br oact ual ) ;

Como puede observarse, para insertar un nodo en el rbol DOM en la posicin deseada
mediante I nser t Af t er , ha de utilizarse el nodo que ser su padre. En este caso el raz,
<bi bl i ot eca>, y el nodo hermano anterior -en este caso un nodo <l i br o>-.

Si lo que se desea es insertar secuencialmente nodos hijos a partir de un nodo padre se
puede utilizar el mtodo AppendChi l d de la clase Xml Node, que es ms cmodo.

/ / Cr eaci n de un nuevo nodo de t i po El ement <t i t ul o>
Xml El ement nodot i t ul o = docxml . Cr eat eEl ement ( " t i t ul o" ) ;

/ / i nser ci n del nodo nuevo en el r bol DOM, como hi j o de un nodo
/ / <l i br o> ( el r ef er enci ado por nodol i br o)
nodol i br o. AppendChi l d( nodot i t ul o) ;

Si lo que se desea insertar son atributos a un nodo, puede hacerse utilizando la coleccin
At t r i but es del nodo, que ofrece los mtodos I nser t Af t er , I nser t Bef or e -similares
a sus correspondientes de la clase Xml Node- y Append -no existe AppendChi l d-.

Append recibe como parmetro un atributo y lo aade al final de la coleccin
At t r i but es del nodo en cuestin.

Ejemplo. A continuacin se muestra cmo insertar el atributo gener o en el nodo
<l i br o>.

/ / Cr eaci n de un nodo nuevo de t i po At t r i but e <gener o>
Xml At t r i but e at r i but o = docxml . Cr eat eAt t r i but e( " gener o" ) ;

/ / adi ci n del at r i but o a l a col ecci n At t r i but es del nodo <l i br o>
nodol i br o. At t r i but es. Append( at r i but o) ;


Suponga que se desea insertar un nodo con un nuevo libro a continuacin del nodo
actual en la aplicacin AccesoDOMDocsXml . Para ello se aadir un botn I nser t ar ,
que al ser pulsado, crear un nuevo nodo <l i br o>, tomando los datos de las cajas de
texto y lo aadir al rbol DOM, justo detrs del nodo <l i br o> actual -el seleccionado
en la lista-. En la lista se insertar tambin el ttulo del nuevo nodo <l i br o>. El cdigo
del mtodo de respuesta al evento Cl i ck sobre el botn I nser t ar (but t on2_Cl i ck) es:

pr i vat e voi d but t on2_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
/ / Cr ear un nodo nuevo de t i po El ement <l i br o>.
Xml Node nodol i br o = docxml . Cr eat eEl ement ( " l i br o" ) ;

/ / Cr eaci n de un nodo nuevo de t i po At t r i but e <gener o>
/ / y adi ci n del at r i but o a l a col ecci n At t r i but es del nodo
/ / <l i br o>
Xml At t r i but e at r i but o =docxml . Cr eat eAt t r i but e( " gener o" ) ;
nodol i br o. At t r i but es. Append( at r i but o) ;

at r i but o = docxml . Cr eat eAt t r i but e( " f echapubl i caci on" ) ;
nodol i br o. At t r i but es. Append( at r i but o) ;
Marco Besteiro y Miguel Rodrguez XML.NET
35/40

at r i but o = docxml . Cr eat eAt t r i but e( " I SBN" ) ;
nodol i br o. At t r i but es. Append( at r i but o) ;

/ / Cr eaci n y adi ci n de t odos l os nodos hi j os de nodol i br o.
Xml El ement nodot i t ul o = docxml . Cr eat eEl ement ( " t i t ul o" ) ;
nodol i br o. AppendChi l d( nodot i t ul o) ;

Xml El ement nodoaut or = docxml . Cr eat eEl ement ( " aut or " ) ;
nodol i br o. AppendChi l d( nodoaut or ) ;

Xml El ement nodonombr e = docxml . Cr eat eEl ement ( " nombr e" ) ;
nodoaut or . AppendChi l d( nodonombr e) ;

Xml El ement nodoapel l i do = docxml . Cr eat eEl ement ( " apel l i do" ) ;
nodoaut or . AppendChi l d( nodoapel l i do) ;

Xml El ement nodopr eci o = docxml . Cr eat eEl ement ( " pr eci o" ) ;
nodol i br o. AppendChi l d( nodopr eci o) ;


/ / Sel ecci n del nodo cor r espondi ent e al l i br o cuyo t t ul o
/ / ha si do sel ecci onado en l a l i st a
/ / l a cadena de sel ecci n es una expr esi n XPat h
Xml Node nodol i br oact ual =
docxml . Sel ect Si ngl eNode( " bi bl i ot eca/ l i br o[ t i t ul o=' " +
l i st Box1. Sel ect edI t em. ToSt r i ng( ) + " ' ] " ) ;

/ / obt enci n del nodo r a z del dr bol DOM
Xml Node nodor ai z = docxml . Document El ement ;

/ / i nser ci n del nodo nuevo en el r bol DOM
/ / j ust o det r s del act ual
nodor ai z. I nser t Af t er ( nodol i br o, nodol i br oact ual ) ;

/ / i nser ci n del t t ul o en l a l i st a
l i st Box1. I t ems. I nser t ( ( l i st Box1. Sel ect edI ndex+1) ,
t ext Box4. Text ) ;

/ / act ual i zar el nodo en el r bol DOM
t hi s. Act ual i zar ( nodol i br o) ;
}

Se ha definido una variable referencia para cada nodo creado (nodol i br o, nodot i t ul o,
nodoaut or , nodonombr e, nodoapel l i do, nodopr eci o). Ha sido as para ver de modo
ms claro el sentido del ejemplo pero es muy importante tener en cuenta que no es
necesario crear tantas referencias -ocupan espacio en la pila-, ya que segn se van
creando y aadiendo nodos al nodo <l i br o> se puede reutilizar la referencia a cada
nodo que ha sido aadido.

Es decir, el cdigo

/ / Cr eaci n y adi ci n de t odos l os nodos hi j os de nodol i br o.
Xml El ement nodot i t ul o = docxml . Cr eat eEl ement ( " t i t ul o" ) ;
nodol i br o. AppendChi l d( nodot i t ul o) ;

Xml El ement nodoaut or = docxml . Cr eat eEl ement ( " aut or " ) ;
nodol i br o. AppendChi l d( nodoaut or ) ;

Marco Besteiro y Miguel Rodrguez XML.NET
36/40
Xml El ement nodonombr e = docxml . Cr eat eEl ement ( " nombr e" ) ;
nodoaut or . AppendChi l d( nodonombr e) ;

Xml El ement nodoapel l i do = docxml . Cr eat eEl ement ( " apel l i do" ) ;
nodoaut or . AppendChi l d( nodoapel l i do) ;

Xml El ement nodopr eci o = docxml . Cr eat eEl ement ( " pr eci o" ) ;
nodol i br o. AppendChi l d( nodopr eci o) ;



puede ser sustituido por:

/ / Ot r o modo de cr ear e i nser t ar nodos
/ / ut i l i zando menos var i abl es de r ef er enci a
Xml El ement nodoaux = docxml . Cr eat eEl ement ( " t i t ul o" ) ;
nodol i br o. AppendChi l d( nodoaux) ;

nodoaux = docxml . Cr eat eEl ement ( " aut or " ) ;
nodol i br o. AppendChi l d( nodoaux) ;

Xml El ement nodoaux2 = docxml . Cr eat eEl ement ( " nombr e" ) ;
nodoaux. AppendChi l d( nodoaux2) ;

nodoaux2 = docxml . Cr eat eEl ement ( " apel l i do" ) ;
nodoaux. AppendChi l d( nodoaux2) ;

nodoaux = docxml . Cr eat eEl ement ( " pr eci o" ) ;
nodol i br o. AppendChi l d( nodoaux) ;



Al ejecutar la aplicacin aparecer:

Marco Besteiro y Miguel Rodrguez XML.NET
37/40


Figura 25.20. Aplicacin AccesoDOMDocsXml al lanzarse.

Se ha seleccionado el libro cuyo ttulo es Ci en aos de sol edad y se han modificado
los datos que muestran las cajas de texto. Para aadir el nuevo nodo con esos datos slo
ha de pulsarse el botn I nser t ar .

Marco Besteiro y Miguel Rodrguez XML.NET
38/40


Figura 25.21. Aplicacin AccesoDOMDocsXml tras pulsar el botn I nser t ar . El nuevo
nodo libro, con los datos de las cajas texto se ha insertado tras el seleccionado en la
lista.

Grabar el rbol DOM sobre un fichero XML.
Una vez que se dispone del rbol DOM en memoria y se sabe como manipularlo es
importante saber cmo guardarlo en disco. Para ello, basta con invocar al mtodo Save
de la clase Xml Document pasndole como parmetro un stream -Xml Text Wr i t er , por
ejemplo- asociado al fichero XML sobre el que se desea grabar el rbol DOM que
contiene al documento.

Es posible utilizar el mtodo Wr i t eTo, que es similar a Save. La diferencia es que Save
salva el documento en s y Wr i t eTo salva un nodo de tipo Xml Document . Recurdese
que la clase Xml Document deriva de Xml Node.

Existe otro mtodo similar a Wr i t eTo llamado Wr i t eCont ent To, con la diferencia de
que salva todos los nodos hijo del nodo Xml Document a travs del cual se le invoca.

En este ejemplo se va a aadir un botn Sal var a la aplicacin AccesoDOMDocsXml de
modo que, al ser pulsado, el rbol DOM que se encuentre en memoria sea salvado sobre
el documento l i br os. xml .

El cdigo del mtodo de respuesta al evento Cl i ck sobre el botn Gr abar
(but t on3_Cl i ck) es:

pr i vat e voi d but t on3_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
Marco Besteiro y Miguel Rodrguez XML.NET
39/40
{
Xml Text Wr i t er f i cher ol i br os = new
Xml Text Wr i t er ( " . . \ \ . . \ \ l i br os. xml " , nul l ) ;

f i cher ol i br os. For mat t i ng = For mat t i ng. I ndent ed;

/ / sal var el document o car gado en memor i a
/ / y posi bl ement e modi f i cado, sobr e el
/ / f i cher o or i gi nal " l i br os. xml "
docxml . Save( f i cher ol i br os) ;

/ / cer r ar el f l uj o de escr i t ur a asoci ado al f i cher o
f i cher ol i br os. Cl ose( ) ;
}

Al ejecutar la aplicacin, aparecer el botn Gr abar , si se selecciona un libro, se
insertan los datos deseados y se pulsa el botn modificar, el nuevo libro quedar
aadido al rbol DOM.



Figura 25.22. Aplicacin AccesoDOMDocsXml . Se ha insertado el libro C/C++
Programacin Eficiente.

Al pulsar el botn Gr abar , el fichero l i br os. xml ser machacado con el contenido
del rbol DOM.

Marco Besteiro y Miguel Rodrguez XML.NET
40/40


Figura 25.23. Fichero l i br os. xml con el nuevo libro.