Está en la página 1de 52

Libreras del .

NET
Framework
David Gan Jimnez
P08/B0036/01628

Libreras del .NET Framework

FUOC P08/B0036/01628

ndice

Introduccin..........................................................................................

Objetivos.................................................................................................

1. Clases bsicas...................................................................................

1.1. System Object ...........................................................................

1.2. Tipos valor .................................................................................

1.3. System.Convert .........................................................................

1.4. System.Math ..............................................................................

10

1.5. System.Random .........................................................................

10

1.6. System.String .............................................................................

11

1.7. System.DateTime .......................................................................

15

1.8. System.TimeSpan .......................................................................

16

1.9. System.Exception ......................................................................

17

1.10.System.Array ..............................................................................

17

1.11.System.Environment .................................................................

21

2. Colecciones de datos (System.Collections)...............................

23

2.1. ArrayList ....................................................................................

23

2.2. Hashtable ...................................................................................

24

2.3. Queue y Stack ...........................................................................

25

2.4. Colecciones genricas (System.Collections.Generic) ................

26

3. Entrada/Salida (System.IO).........................................................

28

4. XML (System.Xml).........................................................................

32

4.1. XmlReader y XmlWriter ...........................................................

32

4.1.1. Lectura de documentos XML con XmlReader ...............

32

4.1.2. Escritura de documentos XML con XmlWriter .............

34

4.2. DOM (Document Object Model) ..............................................

35

4.2.1. Estructura de DOM ........................................................

35

4.2.2. Lectura de un documento XML con DOM ...................

36

4.2.3. Navegar por un documento XML con DOM .................

37

4.2.4. Consultar las propiedades de un nodo ..........................

38

4.2.5. Modificacin de un documento XML con DOM ..........

38

4.2.6. Escritura de un documento XML con DOM .................

40

4.3. Validacin de documentos XML ..............................................

40

4.3.1. Validacin del documento XML ...................................

41

4.4. XPath .........................................................................................

43

4.5. XSLT ...........................................................................................

46

Libreras del .NET Framework

FUOC P08/B0036/01628

5. Otras utilidades del framework................................................

48

Actividades.............................................................................................

49

Bibliografa............................................................................................

51

FUOC P08/B0036/01628

Introduccin

La FCL (Framework Class Library) es la librera de clases del .NET Framework.


Dentro de esta librera, podemos encontrar multitud de clases predefinidas
organizadas en namespaces, que nos permiten acceder a las diferentes funcionalidades del sistema operativo y realizar algunas tareas frecuentes en los programas de forma rpida y sencilla, sin necesidad de implementar toda la funcionalidad desde cero. En este tema, veremos las funcionalidades que ofrecen
los namespaces ms importantes de la librera de clases del .NET Framework.

Libreras del .NET Framework

FUOC P08/B0036/01628

Objetivos

El material que se os presenta a continuacin ha sido elaborado teniendo en


cuenta los siguientes objetivos especficos:

1. Aprender a utilizar las clases bsicas del .NET Framework.


2. Utilizar colecciones para almacenar datos.
3. Conocer los mecanismos que proporciona el .NET Framework para el manejo de streams de datos y ficheros.
4. Aprender a manejar documentos y esquemas XML en aplicaciones .NET.
5. Conocer otros namespaces importantes del .NET Framework para desarrollar aplicaciones avanzadas.

Libreras del .NET Framework

FUOC P08/B0036/01628

1. Clases bsicas

El namespaceSystem es el namespace raz de la librera de clases del .NET Framework, el resto de namespaces se incluyen dentro del mismo. Las clases que
pertenecen a este namespace ofrecen funcionalidades bsicas o necesarias para
el resto de funcionalidades de la librera. En este apartado, veremos las ms
importantes.
1.1. System Object
La jerarqua de clases de .NET comienza en la clase Object, es decir, todas
las clases y dems elementos (interfaces, enumeraciones, estructuras, etc.) son,
por herencia directa o indirecta, subclases de Object. Por lo tanto, todas las
clases o elementos heredan y pueden sobrescribir los mtodos de la clase Object para adecuarlos a sus necesidades. Estos mtodos son los siguientes:

Equals. Devuelve true si la instancia que se pasa como parmetro es la


misma que la instancia actual, por ejemplo:

Object o1 = new Object();


Object o2 = new Object();
Object o3 = new o1;
o1.Equals (o2); // Devuelve false
o1.Equals (o3); // Devuelve true
Este mtodo se suele sobrescribir para devolver true cuando la instancia pasada por parmetro sea equivalente a la actual, aunque sean instancias diferentes, por ejemplo:
p1 = new Persona ("Juan", "00000000Y");
p2 = new Persona ("Juan", "00000000Y");
p1.Equals (p2);
Para ello, es necesario escribir un mtodo similar al siguiente en la clase Persona (de otra forma, la instruccin anterior devolvera false):
public override bool Equals(object obj)
{
if (obj is Persona)
{

Persona p = obj as Persona;

Libreras del .NET Framework

FUOC P08/B0036/01628

Libreras del .NET Framework

return p.Nombre == this.Nombre &&&&& p.DNI == this.DNI;


}
else return false;
}

GetHashCode. Devuelve un nmero de hash que se utiliza para almacenar


1

el objeto en tablas de hash (por ejemplo la coleccin Hashtable ). Idealmente, el nmero debe de ser diferente para instancias que representan
objetos diferentes.

GetType. Devuelve el tipo de dato de la instancia actual.

ToString. Devuelve una representacin en cadena de caracteres de la instancia actual. Es til sobrescribir este mtodo para mostrar informacin
sobre instancias de la clase correspondiente fcilmente, por ejemplo:
public override string ToString()
{
return this.Nombre + ", " + this.DNI;
}

El mtodo ToString se llama implcitamente al utilizar una instancia de


objeto dentro de una concatenacin de cadenas de caracteres, por ejemplo,
la siguiente instruccin llamar al mtodo ToString de la clase Persona:
p1 = new Persona ("Juan", "00000000Y");
Console.WriteLine ("Persona: " + p1);
El resultado ser "Persona: Juan, 00000000Y".

1.2. Tipos valor


Dentro del namespace System tambin encontramos los tipos primitivos o tipos valor, cada uno de ellos representado por una estructura (struct). En la siguiente tabla, se resumen las estructuras correspondientes a cada uno de los
tipos:
Tipoprimitivo

Estructura

Descripcin

sbyte

SByte

nmero entero de 8 bits con signo

byte

Byte

nmero entero de 8 bits sin signo

char

Char

carcter unicode de 16 bits

short

Int16

nmero entero de 16 bits con signo

ushort

UInt16

nmero entero de 16 bits sin signo

int

Int32

nmero entero de 32 bits con signo

uint

UInt32

nmero entero de 32 bits sin signo

(1)

Una tabla de hash es una tabla


en la que cada elemento esta identificado por una clave. Los elementos se insertan y se recuperan utilizando la clave correspondiente en
vez de un ndice numrico.

FUOC P08/B0036/01628

Tipoprimitivo

Estructura

Descripcin

long

Int64

nmero entero de 64 bits con signo

ulong

UInt64

nmero entero de 64 bits sin signo

Float

Single

nmero real

Doubl

Double

nmero real de gran precisin

Decimal

Decimal

nmero de 128 bits

Bool

Boolean

valor booleano

Todos los tipos bsicos tienen las siguientes propiedades y mtodos comunes:

CompareTo. Compara un objeto con la instancia actual, por ejemplo:


i1.CompareTo(i2);
El mtodo CompareTo devuelve un valor menor que cero si i1 es menor
que i2, devuelve cero si son iguales, o un valor mayor que cero si i2 es
mayor que i1.

Parse. Intenta convertir una cadena de caracteres a un valor del tipo. Si


no es posible se lanza una excepcin.
Adems, cada tipo tiene otros miembros especficos como por ejemplo:

MinValue y MaxValue (tipos numricos y char). Devuelven el valor


mnimo y el mximo del tipo, respectivamente

Epsilon (float y double). Representa el menor nmero positivo mayor que cero.

IsInfinity (float y double). Devuelve cierto si el valor actual es


infinito.

FalseString y TrueString (bool). Representan las cadenas "false" y "true" respectivamente.

IsDigit, IsLetter, IsLower, IsUpper, IsWhiteSpace, etc.


(char). Indican si el carcter es un dgito, una letra, si es minscula o
mayscula, si es un espacio en blanco, etc.

1.3. System.Convert
La clase Convert contiene una serie de mtodos estticos que permiten convertir entre diferentes tipos de datos. Existe un mtodo de conversin para
cada tipo de dato bsico: ToInt32, ToDouble, ToChar, ToString, etc.

Libreras del .NET Framework

FUOC P08/B0036/01628

10

Cada uno de estos mtodos tiene distintas sobrecargas, cada una de ellas aceptando diferentes tipos de datos. Por ejemplo, podemos convertir un valor de
tipo Double a Int32 del siguiente modo:
double d = 4.7;
int i = Convert.ToInt32(d);
El resultado de la operacin almacenar en la variable i el valor 5, resultante
de redondear el valor 4,7.
1.4. System.Math
Esta clase contiene diferentes mtodos estticos que permiten realizar operaciones matemticas, entre ellos hay los siguientes:

Abs: devuelve el valor absoluto de un nmero

Cos: devuelve el coseno de un ngulo

Exp: devuelve e elevado a una potencia

Log: devuelve el logaritmo de un nmero

Pow: devuelve la potencia de un nmero

Round: redondea un nmero

Sin: devuelve el seno de un ngulo

Sqrt: devuelve la raz cuadrada de un nmero

Tan: devuelve la tangente de un ngulo

La clase Math tambin incluye las constantes E y PI.


1.5. System.Random
La clase Random permite generar nmeros aleatorios. En realidad, los nmeros
generados simulan aleatoriedad a partir de un nmero inicial llamado semilla
(seed). El constructor de la clase permite especificar un seed concreto:
Random r = new Random(45);
Si siempre escogemos el mismo seed, siempre obtendremos la misma secuencia de nmeros aleatorios. Para aumentar la aleatoriedad, el constructor por
defecto de la clase escoge un seed relacionado con la hora del procesador.
Una vez creada una instancia de la clase Random, podemos obtener nmeros
aleatorios utilizando los siguientes mtodos:

Next. Devuelve un nmero entero aleatorio. Una de las sobrecargas de este mtodo permite especificar un rango de valores entre los que se debe
encontrar el nmero aleatorio generado. Por ejemplo, la siguiente instruccin devuelve un entero entre el 0 y el 10).

Libreras del .NET Framework

FUOC P08/B0036/01628

11

Libreras del .NET Framework

int i = r.Next(0, 10);

NextDouble. Devuelve un nmero real aleatorio entre 0,0 y 1,0

NextBytes. Rellena un array de tipo byte con nmeros aleatorios:


byte[] b = new byte[10];
r.NextBytes(b);

Actividad 1
Ejecutad las siguientes acciones:

Cread un mtodo sumar, que reciba dos parmetros de tipo object,


convierta los dos parmetros a tipo entero y devuelva la suma de
nuevo como object.

Cread un mtodo que calcule el volumen de una esfera, indicando


el radio como parmetro. (NOTA: el volumen de la esfera se calcula
como (4 * * r3) / 3).

Cread el mtodo DoubleConvert que reciba un parmetro de tipo


object y devuelva el valor double equivalente al valor numrico
representado por el parmetro.

Cread el mtodo NumeroGanador que devuelva uno de los nmeros


ganadores de la lotera primitiva (entre 1 y 49).

1.6. System.String
Las instancias de la clase string representan cadenas de caracteres. Aunque
se trata de un tipo por referencia, en ciertas ocasiones la clase string se comporta como un tipo valor, por ejemplo:

Inicializacin. La clase string permite inicializar variables sin necesidad


de la palabra clave new, indicando directamente el valor de la cadena de
caracteres:
string s = "un string";

Comparaciones. Las comparaciones entre strings comparan las cadenas de


caracteres que stos contienen, no si representan la misma instancia, como
ocurre con los tipos referencia:
if (s1 == s2)
{
// se ejecuta si s1 y s2 contienen
// dos cadenas iguales (aunque no

Nota
En general el operador == aplicado a instancias de tipos referencia devuelve cierto si las
dos instancias son la misma
y falso si son distintas, aunque su valor sea idntico. Los
strings son una excepcin.

12

FUOC P08/B0036/01628

// sean la misma cadena)


}

La clase string incluye multitud de miembros para permitir la creacin y edicin de cadenas de caracteres, a continuacin repasamos los ms importantes:

Creacin de strings:

Empty. Propiedad esttica que devuelve la cadena vaca.

Operador +. La clase string sobrescribe el operador + como la concatenacin de strings:


string s1 = "Esto es";
string s2 = s1 + " un string";
El contenido final del string s2 es "Esto es un string";

Informacin sobre strings:

Length. Devuelve la longitud de la cadena.

Chars. Indexador que permite recuperar un carcter concreto de la


cadena:
char c = s[i]; // asigna a c el carcter
// i-essimo del string s

Comparacin de strings:

CompareTo. Compara la cadena con otra. Devuelve un valor negativo


si la cadena es menor que la que se pasa por parmetro, 0 si es igual
o un valor positivo si es mayor.

Operador ==. Compara dos cadenas de caracteres y devuelve true si


son iguales o false si son diferentes:
string s1 = "string1";
string s2 = "string2";
string s3 = "string1";

if (s1 == s2)
{
// no se ejecuta
}
else if (s1 == s3)
{
// se ejecuta
}

Bsqueda en strings:

IndexOf. Devuelve la posicin de la primera aparicin de una subcadena dentro de un string:


string s = "Esto es un string";

Libreras del .NET Framework

FUOC P08/B0036/01628

13

s.IndexOf ("s"); // devuelve 1


s.IndexOf ("h"); // devuelve -1
Tambin es posible indicar a partir de qu posicin se debe buscar la
subcadena:
s.IndexOf ("s", 2); // devuelve 6
s.IndexOf ("s", 7); // devuelve 11
s.IndexOf ("s", 12); // devuelve -1

LastIndexOf. Devuelve la posicin de la ltima aparicin de una subcadena dentro de un string. Su funcionamiento es anlogo a IndexOf, pero la bsqueda se realiza de derecha a izquierda en vez de izquierda a derecha.

Modificacin de strings. La cadena de caracteres contenida en una variable de tipo string no se puede modificar directamente. No obstante, es
posible manipular esta cadena y crear otra cadena que contenga las modificaciones. Por eso, todos los mtodos de la clase string que modifican
una cadena devuelven una instancia de string (la nueva cadena creada),
y no modifican la instancia actual.

Insert. Inserta una subcadena en una posicin del string:


string s = "Esto string";
s = s.Insert (5, "es un ");
El resultado es la cadena "Esto es un string".

Remove. Borra un nmero de caracteres de la cadena, a partir de una


determinada posicin:
string s ="Esto es un string";
s = s.Remove (5, 4);
El resultado es la cadena "Esto n string";

Replace. Reemplaza una subcadena por otra dentro del string:


string s ="Esto es un string";
s = s.Replace ("s", "h");
El resultado es la cadena "Ehto eh un htring";

Substring. Devuelve una subcadena delimitada del string:


string s ="Esto es un string";
// devuelve la subcadena entre la posicion
// indicada y el final del string, en este
// caso "string"

string s1 = s.Substring (11);


// devuelve la subcadena a partir de la posicion
// indicada en el primer parametro, y de longitud
// indicada en el segundo, en este caso "es un"
string s2 = s.Substring (5, 6);

Libreras del .NET Framework

FUOC P08/B0036/01628

14

Trim. Elimina los espacios en blanco del inicio y el final del string:
string s =" Esto es un string ";
s = s.Trim ();
El resultado es la cadena "Esto es un string"

Otros mtodos:

ToLower y ToUpper. Convierten un string a minsculas o maysculas respectivamente.

Relacionada con la clase string, la clase StringBuilder del namespaceSystem.Text, tambin representa una cadena de caracteres, pero en este
caso s que es posible modificar dicha cadena directamente sobre la misma
instancia, utilizando los diferentes mtodos que proporciona dicha clase, entre otros:

Append. Aade al final de la cadena la representacin en forma de string


de un objeto especificado.
StringBuilder sb = new StringBuilder("Hola");
sb.Append (", bienvenido");
La cadena resultante es "Hola, bienvenido"

Insert. Inserta la representacin en forma de string de un objeto especificado en una posicin determinada.
StringBuilder sb=new StringBuilder("Hola C#");
sb.Insert (4, ", bienvenido a");
La cadena resultante es "Hola, bienvenido a C#"

Remove. Elimina el intervalo de caracteres especificado.


StringBuilder sb=new StringBuilder("Hola");
sb.Remove (1,3);
La cadena resultante es "H"

Replace. Reemplaza todas las apariciones de un carcter o cadena de caracteres.


StringBuilder sb=new StringBuilder("Hola CS");
sb.Replace ('S', '#');
La cadena resultante es "Hola C#"

Por otro lado, es posible utilizar el indexador Chars para acceder o establecer
el carcter de cada posicin de la cadena:
StringBuilder sb = new StringBuilder("Hola CS");
sb[6] = '#';

Libreras del .NET Framework

FUOC P08/B0036/01628

15

El namespace System.Text contiene otras clases que permiten codificar y descodificar una cadena de caracteres en una secuencia de bits, siguiendo un sistema de codificacin como ASCII o Unicode.

Actividad 2
Ejecutad las siguientes acciones:

Cread un mtodo que reciba un parmetro de tipo object, que convierta ese objeto en un string.

Cread un mtodo que calcule el reverso de una cadena de caracteres


(que de la vuelta a la secuencia de caracteres).

Cread un mtodo que devuelva la vocal que aparece ms veces en


una cadena de caracteres.

Cread el mtodo PrimeraLetraEnMayusculas que reciba un


string como parmetro y que devuelva este mismo string poniendo en maysculas la primera letra de cada palabra y en minsculas el resto de caracteres.

Reescribid el mtodo que calcula el reverso de un string pero con


la clase StringBuilder, de forma que la inversin se realice en la
misma cadena que se pasa como parmetro.

1.7. System.DateTime
La estructura DateTime representa una fecha y un instante de tiempo. Ofrece
diversas propiedades que permiten acceder a las distintos elementos horarios,
entre ellas Year, Month, Day, Hour, Minute, Second y Millisecond.
Incluye tambin las propiedades estticas Now y Today, que devuelven respectivamente un DateTime correspondiente al instante y a la fecha actual.
Por otro lado, contiene varios mtodos AddX, que permiten aadir unidades
de tiempo al valor actual (AddDays, AddMoths, etc.), as como varios mtodos ToX

y FromX que permiten convertir un DateTime en otros tipos y

viceversa. El mtodo Parse permite convertir una fecha en formato string


a tipo DataTime.
La estructura DateTime sobrescribe adems los operadores + y permitiendo
realizar clculos con fechas. El resultado de operar con fechas devuelve un
intervalo de tiempo o TimeSpan:
DateTime d1 = new DateTime(2004, 10, 10);
DateTime d2 = new DateTime(2004, 11, 10);

Libreras del .NET Framework

FUOC P08/B0036/01628

16

TimeSpan ts = d2 d1;
El valor del intervalo ts ser de 31 das. Tambin es posible comparar fechas
con los operadores de comparacin:
if (d1 > d2)
{
Console.WriteLine("d1 es una fecha posterior a d2");
}

1.8. System.TimeSpan
Como ya hemos visto, la estructura TimeSpan representa un intervalo de tiempo. Igual que la estructura DateTime, contiene varias propiedades que permiten acceder a las medidas de tiempo, desde milisegundos (Milliseconds),
hasta das (Days).
La estructura TimeSpan contiene varios mtodos como el mtodo Parse para
convertir un string a TimeSpan, el mtodo Duration que devuelve el mismo TimeSpan en valor absoluto, o Negation que devuelve el mismo TimeSpan pero con signo contrario. Por otro lado, tambin sobrescribe los operadores de suma, resta y comparaciones:
TimeSpan ts1 = new TimeSpan(5);
TimeSpan ts2 = new TimeSpan(3);

TimeSpan ts3 = ts1 - ts2; // el resultado es 2


if (ts1 > ts2)
{
Console.WriteLine("ts1 es mayor que ts2");
}

Actividad 3
Ejecutad las siguientes acciones:

Cread el mtodo DiasTotales que calcule el nmero de das que


han pasado desde el inicio del calendario hasta una fecha indicada
como parmetro.

Cread el mtodo FechaFinal que reciba como parmetro un objeto DateTime y un objeto TimeSpan, y que devuelva el DateTime
correspondiente a sumar la fecha y el intervalo de tiempo especificados.

Libreras del .NET Framework

FUOC P08/B0036/01628

17

1.9. System.Exception
Esta clase representa una excepcin producida en la aplicacin. El resto de
excepciones de .NET heredan de esta clase o de alguna de sus subclases. La
clase Exception tiene las subclases SystemException y ApplicationException de las que suelen derivar el resto de excepciones de sistema o de
aplicacin en vez de heredar directamente de Exception. Los miembros ms
importantes de un objeto Exception son los siguientes:

Message. Devuelve el mensaje de error que representa la excepcin.

StackTrace. Devuelve el estado de la pila de ejecucin en el momento de


producirse la excepcin.

Source. Devuelve el nombre de la aplicacin que provoc el error.

TargetSite. Devuelve el nombre del mtodo en el que se produjo el error

InnerException. Cuando la excepcin se produce a raz de otra excepcin,


esta propiedad devuelve dicha excepcin.

1.10. System.Array
La clase Array del namespaceSystem es la clase en la que se basan implcitamente todos los arrays. Esta clase define una serie de propiedades que heredan
todos los arrays, entre ellas:

Length. Devuelve el nmero total de posiciones del array.

Rank. Devuelve el nmero de dimensiones del array.

Por otro lado, contiene varios mtodos estticos que permiten realizar operaciones sobre arrays, entre otros existen los siguientes:

Clear. Inicializa las posiciones indicadas del array. Para valores numricos
se inicializa a cero si el array es numrico, a false si es booleano o null
si es un array de referencias a objetos. La siguiente instruccin inicializa 3
posiciones del array a, a partir de la posicin 2:
Array.Clear (a, 2, 3);

Copy. Permite copiar partes de un array en otro. La siguiente instruccin


copia las 4 posiciones a partir de la posicin 3 del array a1, en el array a2
a partir de la posicin 5:
Array.Copy (a1, 3, a2, 5, 4);

Libreras del .NET Framework

18

FUOC P08/B0036/01628

IndexOf. Devuelve la primera posicin de un elemento en el array.

LastIndexOf. Devuelve la ltima posicin de un elemento en el array.

Reverse. Invierte las posiciones indicadas del array (la primera posicin
pasa a ser la ltima, la segunda la penltima, etc. La primera instruccin
del siguiente ejemplo invierte todo el array, mientras que la segunda slo
invierte las posiciones de la 4 a la 7:
Array.Reverse (a);
Array.Reverse (a, 4, 7);

Sort. Ordena los elementos de un array unidimensional. Para poder realizar la ordenacin, es necesario que los elementos del array implementen la
interfaz IComparable, o proporcionar una instancia de una clase que implemente la interfaz IComparer, que permita comparar dos elementos del
tipo del array entre s. A continuacin, veremos un ejemplo de cada una.
La interfaz IComparable se utiliza para poder comparar diferentes objetos
entre s. Esta interfaz define el mtodo CompareTo, que devuelve un entero que indica si la instancia sobre la que se invoca dicho mtodo es menor,
igual o mayor que la instancia que se pasa por parmetro (devuelve un valor menor que cero, cero o mayor que cero respectivamente). En concreto,
el mtodo Sort utiliza esta interfaz para poder comparar los elementos
del array entre s al realizar la ordenacin.
Todos los tipos valor y algunos tipos referencia (como por ejemplo la clase
string) implementan la interfaz IComparable de forma que se puede
utilizar el mtodo Sort directamente con cualquier array de estos tipos.
Para poder utilizar el mtodo Sort con un array de objetos de una clase
personalizada, es necesario que dicha clase implemente esta interfaz. Por
ejemplo, si queremos ordenar un array de la clase Persona por dni, en
primer lugar deberemos modificar la clase Persona para que implemente
la interfaz IComparable:
public class Persona : IComparable
{
int dni;
char letranif;
string nombre;

public int CompareTo(object o)


{
Persona p = o as Persona;

if (p != null)
{
return this.dni - p.dni;
}

throw new Exception ("No se pueden comparar

Libreras del .NET Framework

19

FUOC P08/B0036/01628

instancias de diferentes tipos");


}
}

Para ordenar un array de objetos Persona simplemente llamamos al mtodo Sort de la clase Array:
Array.Sort(personas);
Tanto la interfaz IComparable, como el mtodo Sort, tienen versiones
genricas que permiten especificar el tipo de elementos que se comparan.
El siguiente ejemplo muestra las diferencias en la clase Persona al utilizar
la versin genrica de la interfaz IComparable:
public class Persona : IComparable<Persona>
{
int dni;
char letranif;
string nombre;

public int CompareTo(Persona p)


{
return this.dni - p.dni;
}
}

Como ya hemos comentado antes, el mtodo Sort tambin permite utilizar una instancia de IComparer para realizar la comparacin entre elementos. Esta opcin se suele utilizar cuando no se puede modificar la clase
de los elementos del array. La interfaz IComparer es genrica, y define el
mtodo Compare, que recibe dos instancias de la clase que se compara, y
devuelve un entero menor, igual o mayor que cero, indicando que la instancia del primer parmetro es menor, igual o mayor que la del segundo,
respectivamente.
Para utilizar la interfaz IComparer se puede crear una clase nueva, o utilizar una ya existente y aadirle el mtodo Compare. En el caso del array
de Persona la clase comparadora podra quedar as:
public class ComparadorPersonas : IComparer<Persona>
{
public int Compare(Persona p1, Persona p2)
{
return p1.DNI - p2.DNI;
}
}

La llamada al mtodo Sort, en este caso, sera la siguiente:


Array.Sort(personas, new ComparadorPersonas());

Exists y Find. Estos dos mtodos buscan el primer elemento de un


array que cumpla una determinada condicin. El primero devuelve true si

Libreras del .NET Framework

FUOC P08/B0036/01628

20

Libreras del .NET Framework

se encuentra o false en caso contrario, mientras que el segundo devuelve


el elemento encontrado.
Para especificar la condicin que se va a comprobar en cada elemento del
array, se utiliza el delegado Predicate:
public delegate bool Predicate<T> (T obj)
Por ejemplo, para buscar el primer elemento par en un array de enteros
utilizaramos la siguiente instruccin:
int i = Array.Find<int>(ai, new Predicate<int>(EsPar));
Donde EsPar es un mtodo que comprueba que un entero es par:
public static bool EsPar(int i)
{
return i % 2 == 0;
}

ForEach. Ejecuta la accin indicada en cada elemento del array. Para especificar la accin que se va a realizar en cada elemento del array, se utiliza
el delegado Action:
public delegate void Action<T> (T obj)
Por ejemplo, para subir el sueldo de todos los empleados de un array de
Empleado, podemos utilizar la siguiente instruccin:
Array.ForEach<Empleado>(ae,

new

Action<Empleado>(SubirSueldo));
Donde SubirSueldo es un mtodo que incrementa la propiedad Sueldo
de un empleado:
public static void SubirSueldo(Empleado e)
{
e.Sueldo += 200;
}

Resize. Permite modificar el tamao del array. La siguiente instruccin


cambia el tamao del array a 10 posiciones.
Array.Resize (a, 10);

Actividad 4
Ejecutad las siguientes acciones:

Cread el mtodo SumarATodos que sume a todas las posiciones de


un array de enteros, un valor indicado.

Cread el mtodo ReverseMatrix, que invierta una matriz de enteros rectangular de 2 dimensiones, es decir, que devuelva una matriz
en la que las filas de la matriz inicial pasen a ser las columnas de la
nueva y las columnas las filas.

FUOC P08/B0036/01628

21

1.11. System.Environment
La clase Environment ofrece una serie de propiedades y mtodos estticos que
permiten consultar diferentes caractersticas del entorno en el cual se ejecuta
la aplicacin. Entre ellos, destacamos los siguientes:

CurrentDirectory. Obtiene la ruta de acceso completa del directorio en


el que se inicia la aplicacin.

MachineName. Obtiene el nombre del equipo en el que se ejecuta la aplicacin.

OSVersion. Devuelve una instancia de la clase OperatingSystem que


contiene informacin sobre el sistema operativo en el que se ejecuta la
aplicacin.

ProcessorCount. Obtiene el nmero de procesadores del equipo actual.

StackTrace. Obtiene la informacin de la pila actual de ejecucin.

SystemDirectory. Devuelve la ruta de acceso completa del directorio del


sistema.

TickCount. Obtiene el nmero de milisegundos que han pasado desde


que se inici el sistema en el que se ejecuta la aplicacin.

UserDomainName. Obtiene el nombre de dominio de red asociado al usuario actual.

UserName. Devuelve el nombre del usuario que inici la aplicacin.

WorkingSet. Devuelve la cantidad de memoria fsica asignada al contexto


del proceso actual.

GetEnvironmentVariable. Este mtodo permite consultar el de una variable de entorno, por ejemplo, la siguiente instruccin devuelve el valor
de la variable de entorno PATH en el equipo en el que se ejecuta la aplicacin:
string path = Environment.GetEnvironmentVariable("PATH");

GetEnvironmentVariables. Recupera todos los nombres de las variables


de entorno y sus valores. Este mtodo devuelve una instancia de la interfaz
IDictionary:
IDictionary vars = Environment.GetEnvironmentVariables();
La interfaz IDictionary define varias propiedades y mtodos que permiten consultar los valores del diccionario, almacenados en forma de <clave, valor>. El siguiente ejemplo muestra cmo recorrer todo el diccionario

Libreras del .NET Framework

FUOC P08/B0036/01628

22

para mostrar por pantalla la informacin de cada una de las variables de


entorno:
foreach (string s in vars.Keys)
{
Console.WriteLine("Variable: " + s);
Console.WriteLine("Valor: " + vars[s]);
}

SetEnvironmentVariable. Crea, modifica o elimina una variable de entorno. El siguiente ejemplo muestra cmo extender la variable path del
sistema:
string p = Environment.GetEnvironmentVariable("PATH");
Environment.SetEnvironmentVariable("PATH",p+";C:\\TEMP");

GetFolderPath. Permite obtener la ruta de alguna de las carpetas especiales del sistema. Para indicar qu carpeta se quiere obtener se utiliza la
enumeracin SpecialFolder:
string escritorio =
Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
La enumeracin SpecialFolder contiene otros elementos como Favorites, MyComputer, MyDocuments, ProgramFiles, etc.

GetLogicalDrives. Devuelve un array de string con los nombres de


las unidades lgicas del equipo en el que se ejecuta la aplicacin.

Libreras del .NET Framework

FUOC P08/B0036/01628

23

2. Colecciones de datos (System.Collections)

Los arrays permiten crear agrupaciones de objetos, as como poder acceder a


los elementos por la posicin en la que se encuentran. No obstante, los arrays
tienen dos limitaciones fundamentalmente. La primera es que todos los elementos del array deben de ser del mismo tipo. La segunda limitacin es que
hay que definir la longitud exacta del array al crearlo, y extender un array es
un proceso lento.
Por eso, existen en la librera de clases del .NET Framework, un conjunto de
utilidades dentro del namespaceSystem.Collections, que implementan diferentes tipos que permiten almacenar y gestionar grupos de datos. A continuacin, veremos los ms importantes.
2.1. ArrayList
Representa una lista de elementos. Tal y como su nombre indica, se puede
acceder a sus elementos como si se tratase de un array, por posicin, mediante
los smbolos [ y ].
Para inicializar un ArrayList podemos utilizar el constructor sin parmetros,
que inicializa un ArrayList vaco, o especificar el nmero de posiciones iniciales que se va a tener. A partir de la versin 3.0 de C# (disponible en la versin 3.5 del .NET Framework), es posible tambin inicializar el ArrayList (y
en general cualquier coleccin) especificando los valores concretos que va a
contener (como ya era posible hacer en el caso de los arrays). La sintaxis concreta es la siguiente:
ArrayList numerosPrimos = new ArrayList { 1, 2, 3, 5, 7, 9,
11, 13, 17, 19 };
Los miembros ms importantes de la clase ArrayList son los siguientes:

Count. Propiedad que devuelve el nmero de elementos del ArrayList.

Add. Aade un nuevo elemento al final del ArrayList.

Clear. Elimina todos los elementos del ArrayList.

Contains. Devuelve true si el elemento especificado esta dentro del


ArrayList, en otro caso devuelve false.

IndexOf. Devuelve la posicin de un elemento dentro del ArrayList. Si


no existe, devuelve -1.

Insert. Inserta un elemento en el ArrayList, en la posicin indicada.

RemoveAt. Elimina del ArrayList el elemento de la posicin indicada.

Libreras del .NET Framework

FUOC P08/B0036/01628

24

Veamos un ejemplo de utilizacin de un ArrayList:


ArrayList numList = new ArrayList ();
numList.Add (1); numList.Add (2);
numList.Add (4); numList.Add (5);
int c = numList.Count; // c valdr 4
bool b = numList.Contains (3); // b1 ser false
numList.Insert (3, 2); // inserta el 3 entre el 2 y el 4
b = numList.Contains (3); // b1 ser true
int i = numList.IndexOf (4); // i valdr 3
numList.RemoveAt (4); // Elimina el 5 del ArrayList
2.2. Hashtable
Representa una tabla de hash o diccionario, en la que los elementos se identifican con una clave. Para insertar o recuperar un elemento es necesario especificar su clave entre los smbolos [ y ], en vez de una posicin como en el ArrayList. Tanto la clave como el elemento almacenado pueden ser de cualquier
tipo. Los miembros ms importantes de un Hashtable son los siguientes:

Count. Propiedad que devuelve el nmero de elementos del Hashtable.

Keys. Devuelve una coleccin que contiene las claves de los elementos
del Hashtable.

Values. Devuelve una coleccin que contiene los elementos del Hashtable.

Add. Aade un nuevo elemento al Hashtable. Hay que indicar una clave
que identifique al elemento.

Clear. Elimina todos los elementos del Hashtable.

Contains. Devuelve true si existe algn elemento con la clave especificada, en otro caso devuelve false.

ContainsValue. Devuelve true si el elemento especificado existe en el


Hashtable, en otro caso devuelve false.

Remove. Elimina del Hashtable el elemento con la clave especificada.

Veamos un ejemplo de utilizacin de un Hashtable. Supondremos que las


variables p1, p2, p3 y p4 contienen instancias de la clase Persona. La clave
que utilizaremos ser el DNI:
Hashtable h = new Hashtable ();
h.Add (p1.DNI, p1);
h.Add (p2.DNI, p2);
h.Add (p3.DNI, p3);

bool b = h.Contains (p4.DNI); // b ser false


b = h.ContainsValue (p3); // b ser true

foreach (Persona p in h.Values)

Libreras del .NET Framework

FUOC P08/B0036/01628

25

{ // iteracin sobre los elementos del Hashtable }

2.3. Queue y Stack


Las colecciones Queue y Stack representan, como sus nombres indican, colas
y pilas de elementos respectivamente. La filosofa de una cola es FIFO (First in,
first out), es decir los elementos se aaden al final, y se sacan de la cola por
el principio, en el orden de llegada a la cola. En cambio, las pilas tienen un
comportamiento LIFO (Last in, first out), ya que los elementos se aaden y se
sacan de la pila por el mismo sitio, de forma que al sacar un elemento ste es
el ltimo que se aadi.
Las colas, aparte de los mtodos Count, Contains o Clear tpicos del resto
de colecciones, tienen tres mtodos especficos para aadir, consultar o eliminar elementos:

Enqueue. Aade un elemento al final de la cola.

Dequeue. Devuelve el elemento del principio y lo elimina de la cola.

Peek. Devuelve el elemento del principio sin eliminarlo de la cola.

Como se puede ver, slo es posible aadir elementos al final de la cola, y tan
slo es posible consultar o eliminar elementos del principio de la cola. El siguiente ejemplo muestra cmo utilizar los mtodos anteriores:
Queue q = new Queue ();
q.Enqueue (1); q.Enqueue (2); q.Enqueue (3);

int i = (int)q.Peek (); // i vale 1


i = (int)q.Dequeue (); // i vale 1
i = (int)q.Dequeue (); // i vale 2
i = (int)q.Peek (); // i vale 3

Las pilas, por otro lado, aparte de los mtodos Count, Contains o Clear,
tienen los siguientes mtodos especficos para acceder a sus elementos:

Push. Inserta un elemento en la parte superior de la pila.

Pop. Devuelve el elemento que hay en la parte superior y lo elimina de


la pila.

Peek. Devuelve el elemento que hay en la parte superior sin eliminarlo


de la pila.

En el caso de las pilas tampoco es posible acceder a otros elementos, excepto


el que hay en la parte superior. El siguiente ejemplo es anlogo al de las colas,
pero en este caso utilizamos una pila para ver la diferencia:
Stack s = new Stack ();
s.Push (1); s.Push (2); s.Push (3);

Libreras del .NET Framework

26

FUOC P08/B0036/01628

int i = (int)s.Peek (); // i vale 3


i = (int)s.Pop (); // i vale 3
i = (int)s.Pop (); // i vale 2
i = (int)s.Peek (); // i vale 1

2.4. Colecciones genricas (System.Collections.Generic)


A partir de la versin 2.0 del .NET Framework, con la aparicin de los tipos genricos, tambin aparecen las colecciones genricas, que permiten almacenar
tipos concretos de datos, pero de forma genrica. El comportamiento de las
colecciones genricas es anlogo al de las colecciones normales; simplemente,
es necesario indicar el tipo de datos que se va a utilizar al crear una instancia.
En la siguiente tabla, se muestran las colecciones equivalentes a las colecciones genricas ms importantes:
Coleccingenrica

Coleccinequivalente

List<T>

ArrayList

Dictionary<K,V>

Hastable

Queue<T>

Queue

Stack<T>

Stack

SortedList<T>

SortedList

Para mostrar el funcionamiento de las colecciones genricas, modificaremos


el ejemplo de la utilizacin de Hashtable para utilizar un Dictionary:
Dictionary<int,Persona> d = new Dictionary<int,Persona>();
d.Add(p1.DNI, p1);
d.Add(p2.DNI, p2);
d.Add(p3.DNI, p3);

bool b = d.ContainsKey(p4.DNI); // b ser false


b = d.ContainsValue(p3); // b ser true
Persona p = d[33333333];

En el ejemplo, se puede ver que la clase Dictionary no tiene el mtodo Contains, sino ContainsKey en su lugar. Por otro lado, la ltima instruccin
recupera un elemento de tipo persona del diccionario sin necesidad de realizar
una conversin explcita, como hara falta en el caso de utilizar un Hashtable.

Libreras del .NET Framework

FUOC P08/B0036/01628

27

Actividad 5
Ejecutad las siguientes acciones:

Cread un ArrayList e insertar varios elementos de tipo string.

Insertad un elemento en la posicin 1 de la coleccin anterior.

Cread un Hashtable e insertad varios pares <string, DateTime>.

Eliminad uno de los elementos de la coleccin anterior.

Cambiad las colecciones anteriores por sus correspondientes colecciones genricas.

Libreras del .NET Framework

FUOC P08/B0036/01628

28

3. Entrada/Salida (System.IO)

El namespaceSystem.IO del .NET Framework contiene toda la funcionalidad


de manejo de streams de datos, y concretamente de ficheros. Un stream de datos es un canal de lectura o escritura sobre un determinado medio de almacenamiento de datos, por ejemplo, la memoria, el teclado, la pantalla, o los
ficheros de disco.
Los streams de datos estn representados por la clase Stream. Esta clase contiene miembros que permiten realizar diferentes operaciones sobre un stream:

Length. Devuelve la longitud total del stream.

Position. Devuelve la posicin actual en el stream.

Close. Cierra el stream.

Read. Lee un valor del stream.

Seek. Permite cambiar la posicin actual en el stream.

Write. Escribe un valor en el stream.

La clase Stream es abstracta, por lo tanto no se puede instanciar directamente,


pero existen diversas subclases que s que se pueden utilizar:

BufferedStream. Representa un stream con buffer.

FileStream. Representa un stream asociado a un fichero.

MemoryStream. Representa un stream en memoria.

Para leer o escribir tipos de datos ms complejos de un stream, se suele utilizar un lector (Reader) o escritor (Writer) respectivamente. El namespaceSystem.IO define los siguientes lectores y escritores:

BinaryReader. Permite leer tipos bsicos de un stream en formato binario.

BinaryWrite. Permite escribir tipos bsicos de un stream en formato binario.

StringReader. Permite leer de un string como si fuese un stream de caracteres.

StringWriter. Permite escribir en un string como si fuese un stream de


caracteres.

StreamReader. Permite leer objetos de diversos tipos de un stream.

StreamWriter. Permite escribir objetos de diversos tipos en un stream.

Generalmente, para leer y escribir de ficheros se utilizan las clases StreamReader y StreamWriter, ya que pueden inicializarse directamente especificando el nombre del fichero que se quiere abrir, sin necesidad de crear primero
un objeto de tipo FileStream. Adems, estas dos clases contienen los mto-

Libreras del .NET Framework

FUOC P08/B0036/01628

29

dos ReadLine y WriteLine, que permiten leer o escribir lneas enteras del
fichero respectivamente. En el siguiente ejemplo, vemos un mtodo que lee
un fichero y lo muestra por pantalla:
public void LeerFichero (string file)
{
StreamReader sr = new StreamReader (file);

string s = sr.ReadLine ();

while (s!=null)
{
Console.WriteLine (s);

s = sr.ReadLine ();
}

sr.Close();
}

Este otro ejemplo muestra cmo escribir en un fichero todo lo que se introduce
por el teclado:
public void EscribirFichero (string file)
{
StreamWriter sw = new StreamWriter (file);

string s = Console.ReadLine ();

while (s!="")
{
sw.WriteLine (s);

s = Console.ReadLine ();
}

sw.Close();
}

Al final de una operacin con streams, es importante cerrar el lector o escritor,


de modo que tambin se cierra el stream de datos. Si no se cierra mediante el
mtodo Close, el stream se mantiene abierto hasta que finaliza el programa,
lo que puede influir en el rendimiento del mismo, e impide que el resto de
aplicaciones puedan acceder a dicho stream.

Libreras del .NET Framework

FUOC P08/B0036/01628

30

Aparte de las utilidades para streams, el namespaceSystem.IO contiene algunas clases que permiten la inspeccin de directorios y ficheros, y la manipulacin de los mismos:

Directory. Ofrece mtodos estticos para realizar operaciones sobre directorios, entre otros:

CreateDirectory. Crea un directorio.

Delete. Borra un directorio.

Exists. Determina si un directorio existe.

Move. Mueve un directorio.

DirectoryInfo. Representa un directorio. Incluye propiedades para consultar la informacin correspondiente, y mtodos para trabajar con l, entre ellos:

Attributes. Devuelve los atributos del directorio.

Delete. Borra el directorio.

FullName. Obtiene la ruta completa del directorio.

Parent. Devuelve el directorio padre.

GetDirectories. Devuelve los subdirectorios contenidos en el directorio.

GetFiles. Devuelve los ficheros del directorio.

MoveTo. Mueve el directorio a otra localizacin.

File. Ofrece mtodos estticos para realizar operaciones sobre ficheros,


entre otros:

Copy. Copia un fichero.

Create. Crea un fichero.

Delete. Elimina un fichero.

Exists. Comprueba si existe un fichero.

Move. Mueve un fichero de localizacin.

Open. Abre un FileStream del fichero.

FileInfo. Representa un fichero. Incluye propiedades para consultar la


informacin correspondiente, y mtodos para trabajar con l, entre ellos:

Attributes. Devuelve los atributos del fichero.

Directory. Devuelve el directorio en el que se encuentra el fichero.

Extension. Devuelve la extensin del fichero.

FullName. Devuelve la ruta completa del fichero.

Length. Devuelve el tamao del fichero en bytes.

Path. Contiene miembros estticos para trabajar con strings que contienen
rutas o paths de directorios, de forma independiente del sistema de ficheros
utilizado. Entre otros encontramos los siguientes miembros:

PathSeparator. Representa el separador de directorios especfico de


la plataforma.

GetTempPath. Devuelve el path de la carpeta temporal del sistema.

Libreras del .NET Framework

31

FUOC P08/B0036/01628

GetTempFileName. Crea un fichero temporal y devuelve su localizacin.

Veamos un ejemplo de cmo hacer un recorrido de un directorio y sus subdirectorios, buscando ficheros con extensin .txt y moviendo estos ficheros a la
carpeta C:\TEMP del disco, renombrndolos para evitar colisiones:
public void MoverTXTaTEMP(string dir)
{
MoverTXTaTEMP_rec (new DirectoryInfo (dir));
}

private void MoverTXTaTEMP_rec (DirectoryInfo di)


{
int lastname = 0;

foreach (FileInfo fi in di.GetFiles ())


{
if (fi.Extension == "txt")
{
fi.MoveTo (Path.Combine (fi.DirectoryName,
lastname.ToString() + ".txt"));
lastname++;
}
}

foreach (DirectoryInfo di2 in di.GetDirectories ())


{
MoverTXTaTEMP_rec (di2);
}
}

Actividad 9
Ejecutad las siguientes acciones:

Abrid un fichero de texto y escribid una secuencia de caracteres introducida por el usuario. Al final cerrad el fichero.

Abrid el fichero creado en el apartado anterior y mostrad su contenido por pantalla.

Libreras del .NET Framework

FUOC P08/B0036/01628

32

4. XML (System.Xml)

Dentro del namespace System.Xml encontramos funcionalidades relacionadas


con el uso de documentos XML. A continuacin, veremos las ms importantes.
4.1. XmlReader y XmlWriter
Las clases XmlReader y XmlWriter permiten leer y guardar, respectivamente,
un documento XML de forma secuencial.
4.1.1.

Lectura de documentos XML con XmlReader

La clase XmlReader es una clase abstracta que sirve como base para otras clases ms especficas que permiten leer documentos XML en distintos formatos,
como por ejemplo las clases XmlTextReader (permite leer documentos XML
desde ficheros de texto), XmlNodeReader (permite leer documentos en formato DOM (ver siguiente apartado)), o XmlValidatingReader (permite leer
documentos y validarlos a la vez (ver apartado de validacin de documentos
XML).
No obstante, la clase XmlReader contiene el mtodo esttico Create, que
permite crear una instancia de una de las subclases en funcin de los parmetros de configuracin especificados. En el siguiente ejemplo, se muestra cmo
crear una instancia de XmlReader que lea un documento XML desde un fichero de texto. Al finalizar el proceso sobre el documento, cerramos el objeto
XmlReader mediante el mtodo Close:
XmlReader xr = XmlReader.Create("fichero.xml");

// Procesado del documento aqu

xr.Close();

El mtodo Create acepta otro parmetro de tipo XmlReaderSettings que


permite especificar algunos parmetros adicionales de lectura, como el tratamiento de espacios en blanco o de los comentarios encontrados en el documento, por ejemplo:
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
settings.IgnoreComments = true;
XmlReader r = XmlReader.Create("fichero.xml", settings);

Libreras del .NET Framework

33

FUOC P08/B0036/01628

El procesado de un documento XML mediante la clase XmlReader consiste en


ir leyendo cada uno de sus nodos o elementos de forma secuencial mediante
el mtodo Read. Los nodos pueden corresponder con la definicin de un elemento, con un bloque CDATA, con una declaracin de preprocesador, etc.
Para obtener informacin acerca del tipo de nodo actual, su nombre y su valor, podemos utilizar las propiedades NodeType, Name y Value del XmlTextReader respectivamente. El siguiente ejemplo muestra cmo utilizar la propiedad NodeType para realizar unas acciones u otras en funcin del tipo de
nodo actual:
while (xr.Read ())
{
switch (xr.NodeType)
{
case XmlNodeType.Element:
// acciones en caso de que sea un nodo
// de tipo elemento
break;

case XmlNodeType.Comment:
// acciones en caso de que sea un nodo
// de tipo comentario
break;

...
}
}

Uno de los tipos de nodo que devuelve el mtodo Read es el nodo Whitespace, que representa un espacio en blanco en el documento XML. Esto se debe
a que por defecto se tratan todos los espacios en blanco. Para tratar solamente
aquellos espacios en blanco que son significativos (por ejemplo espacios en
blanco dentro de un texto), debemos cambiar el valor de la propiedad WhitespaceHandling del XmlReader:
xr.WhitespaceHandling = WhitespaceHandling.Significant;
Para acceder a los atributos de un determinado nodo, utilizamos el mtodo
GetAttribute, pudiendo especificar el nombre del atributo que queremos
recuperar, o la posicin que ocupa, como en el siguiente ejemplo, en el que se
muestra por pantalla el valor de los atributos del nodo actual:
for (int i=0;i<xr.AttributeCount;i++)
{
Console.WriteLine (xr.GetAttribute (i));

Libreras del .NET Framework

FUOC P08/B0036/01628

34

Libreras del .NET Framework

4.1.2.

Escritura de documentos XML con XmlWriter

Igual que la clase XmlReader, la clase XmlWriter es abstracta y sirve como


base para otras clases como XmlTextWriter. Tambin esta clase contiene un
mtodo esttico Create que permite crear una instancia de la misma:
XmlWriter xw = XmlWriter.Create ("fichero.xml");
// Escritura de los elementos del documento XML
xw.Close();

El mtodo Create de la clase XmlWriter acepta adems un parmetro opcional de tipo XmlWriterSettings, que permite especificar ciertos parmetros
de escritura. La escritura de elementos al documento XML se lleva a cabo mediante los diferentes mtodos Write de la clase XmlWriter:

WriteStartElement. Escribe el tag de inicio de un elemento.

WriteEndElement. Escribe el tag de final de un elemento. Si el elemento


no contiene datos, se crea un nico tag.

WriteFullEndElement. Escribe el tag de final de un elemento. Aunque


el elemento no contenga datos, se crean dos tags, uno de inicio y otro de
final.

WriteString. Escribe una cadena de caracteres dentro de un elemento.

WriteElementString. Escribe un elemento que contiene una cadena de


caracteres.

WriteCData. Escribe un bloque CDATA.

WriteAttributeString. Escribe un atributo dentro de un elemento.

El siguiente ejemplo muestra cmo utilizar algunos de estos mtodos, y el


documento XML final que se obtiene:
xw.WriteStartElement ("ElementoRaiz");
xw.WriteStartElement ("OtroElemento");
xw.WriteEndElement ();
xw.WriteStartElement ("OtroElemento");
xw.WriteFullEndElement ();
xw.WriteStartElement ("OtroElemento");
xw.WriteAttributeString ("nombreAtributo", "valor");
xw.WriteString ("Esto es el contenido del elemento");
xw.WriteEndElement ();
xw.WriteEndElement ();

<?xml version="1.0" encoding="utf-8" ?>


<ElementoRaiz>
<OtroElemento />
<OtroElemento></OtroElemento>

Direccin web
Ms informacin acerca
de las clases XmlReader y
XmlWriter en las siguientes
direcciones:
<http://
msdn2.microsoft.com/
en-us/library/
9d83k261(VS.80).aspx>
<http://
msdn2.microsoft.com/
en-us/library/
4d1k42hb(VS.80).aspx>

FUOC P08/B0036/01628

35

Libreras del .NET Framework

<OtroElemento nombreatributo="valor">
Esto es el contenido del elemento
</OtroElemento>
</ElementoRaiz>

4.2. DOM (Document Object Model)


DOM es otra tecnologa que permite leer, modificar y grabar ficheros XML. La
diferencia fundamental entre DOM y las clases XmlReader y XmlWriter, es
que DOM permite navegar por el documento, es decir moverse hacia delante
o hacia atrs, acceder directamente a un punto concreto, o hacer bsquedas

Direccin web
DOM es una recomendacin del W3C: <http://
www.w3.org/DOM/>

complejas sobre el contenido del documento.


La desventaja de DOM es que, para poder navegar por el documento o realizar
consultas sobre l, necesita cargar y mantener el documento XML completo
en memoria. La decisin de utilizar una u otra tecnologa para acceder a un
documento XML (XmlReader y XmlWriter, o DOM), depender del tipo de
proceso a realizar sobre el documento (secuencial o puntual), de las limitaciones de memoria, y del tamao de los documentos a procesar.
4.2.1.

Estructura de DOM

DOM organiza el documento en forma de rbol2. Cada nodo del rbol corresponde con uno de los elementos del documento. A diferencia de los nodos
utilizados por las clases XmlReader y XmlWriter, los nodos de DOM incluyen el elemento completo (tag de inicio, contenido y tag final). Cada nodo
tiene un nico nodo padre (excepto el nodo raz), y de 0 a N nodos hijos, correspondientes al contenido del elemento que representa. Los nodos sin hijos
se denominan hojas del rbol.
La funcionalidad de DOM se encuentra dentro del namespaceSystem.Xml.
Las clases ms importantes de DOM son las siguientes:

XmlDocument. Representa el documento XML almacenado en memoria


en forma de rbol.

XmlNode. Representa uno de los nodos del documento.

XmlNodeList. Representa una lista de nodos del documento.

XmlElement. Representa un elemento del documento.

XmlAttribute. Representa un atributo de un elemento.

XmlAttributeCollection. Representa un conjunto de atributos.

XmlComment. Representa un comentario.

XmlText. Representa una porcin de texto.

(2)

Un rbol es una estructura de


datos formada por nodos, en los
que esta contenida la informacin.
Los nodos de un rbol estn relacionados entre s, mediante relaciones padre-hijo. Un nodo puede
tener de 0 a N hijos (si tiene 0 se
denomina nodo hoja), pero slo
puede tener 1 padre. Adems, no
puede haber ciclos (que un nodo
sea a la vez descendiente y ascendiente de otro nodo). El nodo que
no tiene padre se denomina nodo
raz.

FUOC P08/B0036/01628

36

La clase central de DOM es el XmlNode, ya que representa cada uno de los nodos del rbol. El resto de elementos (XmlDocument, XmlAttribute, XmlElement, XmlComment, XmlText, etc.) heredan de XmlNode. Esta clase tiene
diferentes propiedades y mtodos para acceder a los datos del nodo del rbol
que representa. A continuacin, se muestran algunos de los ms importantes:

Attributes. Devuelve un XmlAttributeCollection con los atributos


del nodo.

ChildNodes. Devuelve un XmlNodeList con los nodos hijos del nodo.

HasChildNodes. Devuelve cierto si el nodo tiene nodos hijo, o falso si es


un nodo hoja.

InnerText. Devuelve un string que contiene el valor del nodo concatenado con el contenido de sus nodos hijos, de forma recursiva.

InnerXml. Devuelve un string que contiene la porcin del documento


XML interior al nodo.

Name. Devuelve el nombre del nodo.

NodeType. Indica el tipo de nodo. Los valores posibles son los especificados en la enumeracin XmlNodeType, entre ellos: Attribute, CDATA,
Comment, Element, Whitespace, etc.

OwnerDocument. Devuelve el documento al que pertenece el nodo.

ParentNode. Devuelve el nodo padre.

AppendChild. Aade un nodo hijo al final de la lista de nodos.

InsertAfter. Inserta un nodo despus del nodo indicado.

InsertBefore. Inserta un nodo antes del nodo indicado.

PrependChild. Aade un nodo al principio de la lista de nodos.

RemoveChild. Elimina un nodo de la lista de nodos.

ReplaceChild. Cambia un nodo por otro.

SelectNodes. Devuelve una lista de nodos que cumplen una determinada condicin de bsqueda XPath. Veremos XPath en un apartado posterior dentro de este mismo tema.

WriteTo. Permite grabar el nodo actual mediante un XmlWriter.

A continuacin, veremos cmo utilizar algunas de estas propiedades y mtodos para manipular documentos XML.
4.2.2.

Lectura de un documento XML con DOM

Para cargar un documento XML en una estructura DOM, utilizamos el mtodo


Load del objeto XmlDocument:
XmlDocument doc = new XmlDocument ();
doc.Load ("XMLFile.xml");

Tambin se puede cargar, en una estructura DOM, un texto en formato XML


que est almacenado dentro de una variable de tipo string, mediante el mtodo LoadXML:

Libreras del .NET Framework

37

FUOC P08/B0036/01628

string x = "<parking>" +
"<coche color=\"ROJO\">" +
"<marca>SEAT</marca>" +
"<modelo>IBIZA</modelo>" +
"</coche>" +
"</parking>";

XmlDocument doc = new XmlDocument ();


doc.LoadXml (x);

4.2.3.

Navegar por un documento XML con DOM

Una vez que la informacin XML se ha cargado en memoria en forma de rbol


DOM, es posible navegar por esta estructura para encontrar nodos concretos
y realizar operaciones sobre ellos.
Has varias formas de navegar en una estructura DOM, que veremos a continuacin. La primera de ellas es utilizando la relacin padre-hijo de los nodos
desde el nodo principal hasta llegar al nodo que estamos buscando, o hasta
llegar a una hoja.
El objeto XmlDocument que creamos para leer el documento XML es, a su vez,
un objeto de tipo XmlDocument, cuyo nodo hijo es el nodo raz del rbol. A
partir de este nodo, podemos movernos hacia abajo (hacia los hijos), utilizando la propiedad ChildNodes, que devuelve la lista de nodos hijo, en forma
de un objeto XmlNodeList. Esta clase se comporta de forma muy similar a
los ArrayList, aunque sus elementos slo pueden ser de tipo XmlNode. Para movernos hacia arriba (hacia el nodo padre), utilizamos la propiedad ParentNode que devuelve un elemento de tipo XmlNode. En el siguiente ejemplo, se ve cmo realizar un recorrido en profundidad de un rbol DOM:
RecorrerHijos (doc.FirstChild);

void RecorrerHijos (XmlNode node)


{
foreach (XmlNode n in node.ChildNodes)
{
MostrarContenidoNodo (n);
RecorrerHijos (n);
}
}

Otra forma de navegar por una estructura DOM es buscando elementos concretos por nombre, mediante el mtodo GetElementsByTagName de la clase
XmlNode. Este mtodo devuelve un XmlNodeList que contiene todos los no-

Libreras del .NET Framework

FUOC P08/B0036/01628

38

Libreras del .NET Framework

dos correspondientes a los elementos con el nombre especificado, que se encuentran dentro del elemento correspondiente al nodo sobre el que se ejecuta
el mtodo, por ejemplo:
node.GetElementsByTagName ("coche");
La instruccin anterior devuelve todos los nodos de los elementos coche que
se encuentran dentro del elemento representado por el nodo node.
Finalmente, existe otra forma de navegar por un documento XML, que consiste en acceder directamente a los nodos que nos interesa, utilizando algn
mecanismo de bsqueda de nodos como XPath o XQuery. Veremos estas dos
tcnicas en otro apartado.
4.2.4.

Consultar las propiedades de un nodo

Una vez situados en un nodo, podemos consultar sus datos mediante las propiedades que comentamos anteriormente. El siguiente ejemplo ilustra cmo
mostrar la marca el modelo y el color de todos los coches del documento XML:
XmlNodeList parking = doc.GetElementsByTagName ("coche");

foreach (XmlNode n in parking)


{
Console.WriteLine (n.ChildNodes[0].InnerText + " " + .n.ChildNodes[1].InnerText + " " +
n.Attributes["color"].Value);
}

Tanto la marca como el modelo son elementos anidados dentro del elemento coche, por lo que accedemos a ellos mediante la propiedad ChildNodes
del nodo coche, y utilizamos la propiedad Value para obtener su valor. En
cambio, el color del coche es un atributo, por lo que utilizamos la propiedad
Attributes para acceder a l.
4.2.5.

Modificacin de un documento XML con DOM

La modificacin de un documento mediante DOM consiste en introducir, eliminar o cambiar nodos en el rbol. Estas operaciones se pueden llevar a cabo
mediante los diferentes mtodos de la clase XmlNode que comentamos anteriormente.
Para borrar un nodo hijo, utilizamos el mtodo RemoveChild. El ejemplo siguiente borra el elemento marca del elemento coche representado por la variable coche:
coche.RemoveChild (coche.ChildNodes[0]);

FUOC P08/B0036/01628

39

Para borrar atributos, utilizamos el mtodo RemoveAttribute, como en el


siguiente ejemplo en el que eliminamos el atributo color del coche:
coche.RemoveAttribute ("color");
La modificacin del valor de un elemento se realiza mediante la propiedad
Value del nodo correspondiente, por ejemplo, cambiamos el modelo del coche del siguiente modo:
coche.ChildNodes[1].Value = "TOLEDO";
La propiedad Value tambin sirve para modificar el valor de un atributo. En
el siguiente ejemplo, cambiamos el valor del atributo color del coche:
coche.Attributes["color"].Value = "blanco";
Tambin es posible crear nuevos elementos o atributos y aadirlos al documento. Esto se consigue mediante los mtodos AppendChild, PrependChild, InsertAfter e InsertBefore para elementos, y mediante la propiedad Attributes para los atributos.
No obstante, no es posible crear nodos nuevos directamente, ya que el constructor de la clase XmlNode y de sus subclases (excepto XmlDocument), son
protegidos. Para poder crear elementos XmlNode, es necesario utilizar los diferentes mtodos de creacin que proporciona la clase XmlDocument. El siguiente ejemplo crea un documento vaco, crea el elemento raz parking y
aade un elemento coche:
// crea el elemento principal y lo aade al documento
XmlElement parking = doc.CreateElement ("parking");
doc.AppendChild (parking);

// crea el elemento coche y lo aade al elemento principal


XmlElement coche = doc.CreateElement ("coche");
parking.AppendChild (coche);

// crea el atributo color y lo aade al elemento coche


XmlAttribute color = doc.CreateAttribute ("color");
color.Value = "rojo"; coche.Attributes.Append (color);

// crea el elemento marca y lo aade al elemento coche


XmlElement marca = doc.CreateElement ("marca");
XmlText marcatext = doc.CreateTextNode ("SEAT");
marca.AppendChild (marcatext); coche.AppendChild (marca);

// crea el elemento modelo y lo aade al elemento coche


XmlElement modelo = doc.CreateElement ("modelo");

Libreras del .NET Framework

FUOC P08/B0036/01628

40

XmlText modelotext = doc.CreateTextNode ("IBIZA");


modelo.AppendChild (modelotext);
coche.AppendChild (modelo);

// muestra el resultado por pantalla


<p>Console.WriteLine (doc.OuterXml);</p>

El resultado mostrado por pantalla es el siguiente:


<parking>
<coche color="rojo">
<marca>SEAT</marca>
<modelo>IBIZA</modelo>
</coche>
</parking>

4.2.6.

Escritura de un documento XML con DOM

Una vez acabado el proceso de modificacin de un documento XML, es posible


guardar los cambios de nuevo en un fichero XML, mediante el mtodo Save
de la clase XmlDocument:
doc.Save ("XMLFile.xml");
4.3. Validacin de documentos XML
Para validar un documento, es necesario enlazarlo con su esquema, es decir,
indicar cul es el esquema que cumple ese documento. Si el contenido del
documento XML no est cualificado por un namespace, enlazaremos con el
esquema aadiendo los siguientes atributos al elemento principal:
<ElementoRaiz xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="URL-esquema">

Donde URL-esquema es la direccin en la que se encuentra el esquema. En


cambio, si los elementos de un documento XML estn cualificados por un
namespace, entonces enlazaremos de esta otra forma:
<ElementoRaiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="URI-namespace URL-esquema">

Donde URI-namespace es el URI correspondiente al namespace y URLesquema la direccin en la que se encuentra el esquema. La instruccin
xsi:schemaLocation enlaza el contenido del documento que est cualifica-

Libreras del .NET Framework

FUOC P08/B0036/01628

41

do por el namespaceURI-namespace, con el esquema URL-esquema, es decir, el contenido cualificado por el namespaceURI-namespace se validara con
respecto al esquema URL-esquema.
En este caso, puede haber tantas definiciones xsi:schemaLocation como
namespaces tenga definidos el documento a validar, incluso se puede especificar la definicin xsi:noNamespaceSchemaLocation para enlazar el contenido del documento que no est cualificado por ningn namespace con un
esquema.
Al enlazar el contenido cualificado por un namespace con un esquema, es necesario especificar que el esquema se aplica a ese namespace, mediante el atributo targetNamespace que comentbamos anteriormente:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="URI-namespace"
elementFormDefault="qualified">

El atributo elementFormDefault indica que los elementos definidos estn


cualificados por defecto por el namespace especificado.
4.3.1.

Validacin del documento XML

La clase XmlReader permite validar los documentos XML en paralelo a su lectura. En realidad, la clase que se utiliza internamente para realizar la validacin es la clase XmlValidatingReader, que hereda de la clase XmlReader.
Para realizar la validacin de un documento, en primer lugar se crea una instancia de la clase XmlSchema, asignando la url del fichero que contiene el
schema xsd a la propiedad SourceUri de la misma:
XmlSchema s = new XmlSchema ();
s.SourceUri = "esquema.xsd";

A continuacin, se configura una instancia de la clase XmlReaderSettings,


indicando el esquema o esquemas que se van a utilizar, mediante la propiedad
Schemas. Es necesario tambin especificar el tipo de validacin mediante la
propiedad ValidationType (otras opciones son DTD, XDR o None. Esta
ltima es la opcin por defecto):
XmlReaderSettings settings = new XmlReaderSettings ();
settings.Schemas.Add (s);
settings.Schemas.Compile();
settings.ValidationType = ValidationType.Schema;

Libreras del .NET Framework

FUOC P08/B0036/01628

42

Libreras del .NET Framework

Para especificar la lista de esquemas que se aplican sobre el documento, se utiliza la clase XmlSchemaSet (el tipo de la propiedad settings.Schemas). A
este conjunto de esquemas XML se pueden aadir nuevas instancias de XmlSchema mediante el mtodo Add, como vemos en el ejemplo. Una vez aadidos
todos los esquemas al XmlSchemaSet, es necesario llamar al mtodo Compile
para que se procesen los esquemas aadidos.
Finalmente, creamos una instancia de la clase XmlReader, indicando el nombre del fichero XML a leer y pasando como segundo parmetro la instancia de
XmlReaderSettings creada:
XmlReader reader = XmlReader.Create ("in.xml", settings);
Mediante esta instancia de XmlReader podemos leer el documento. A medida
que avanzamos en su lectura, se va realizando tambin la validacin:
while(reader.Read())
{
// procesado del fichero
// el documento se valida en paralelo
}
reader.Close();

Al final, cerramos el XmlReader mediante el mtodo Close para terminar la


lectura y la validacin del documento.
Durante la validacin, se pueden producir errores de validacin, es decir, que
el validador encuentra elementos que no cumplen el esquema o esquemas especificados. Estos errores de validacin se gestionan mediante el evento ValidationEvent de la clase XmlReaderSettings:

Direccin web
Ms informacin acerca de
la validacin de documentos
XML en .NET en la siguiente
direccin Web:
<http://
msdn2.microsoft.com/en-us/
library/hdf992b8.aspx>

settings.ValidationEventHandler +=

new ValidationEventHandler(set_ValidationEventHandler);

Y en el mtodo que gestiona el evento, aadimos las instrucciones necesarias


para solucionar el error, cancelar el proceso o avisar al usuario:
private static void set_ValidationEventHandler
(object sender, ValidationEventArgs e)
{
Console.WriteLine ("Se ha producido el siguiente error de validacin: " + e.Message);
}

FUOC P08/B0036/01628

43

4.4. XPath
XPath es un lenguaje que se utiliza conjuntamente con otras tecnologas como XQuery o XSLT. Por otro lado, XPath tambin es til para buscar nodos
dentro de un rbol DOM que cumplan una determinada condicin. Para ello,
utilizamos el mtodo SelectNodes de la clase XmlNode:
XmlNodeList nl = nodo.SelectNodes (expression-XPath);
El siguiente ejemplo muestra cmo hacer un listado de los coches del parking
que son de color verde:
XmlDocument doc = new XmlDocument ();

doc.Load ("parking.xml");

XmlNodeList nl = doc.SelectNodes("//coche[@color='verde']");

foreach (XmlNode n in nl)


{
// muestra el nodo por pantalla
Console.WriteLine (n.OuterXml);
}

Aunque XPath puede utilizarse para realizar bsquedas sobre documentos


DOM mediante el mtodo SelectNodes, ya comentamos anteriormente que
este no es el mecanismo ms eficiente, porque DOM se centra en la sintaxis
del documento, no en los datos que contiene.
Para trabajar con XPath o con otros lenguajes de consulta o transformacin
como XSLT (que veremos en el prximo apartado), existe la clase XPathDocument (dentro del namespaceSystem.Xml.XPath), que permite leer un documento XML y realizar consultas XPath o transformaciones XSLT ms eficientemente, ya que internamente almacena el documento mediante el modelo
de objetos de XPath.
Para leer un documento en un XPathDocument, especificamos su ubicacin
en el constructor de la clase:
XPathDocument doc = new XPathDocument ("doc.xml");
La clase XPathDocument en realidad slo tiene un mtodo propio, llamado
CreateNavigator, que devuelve una instancia de XPathNavigator que es
la que permite navegar por el documento:
XPathNavigator nav = doc.CreateNavigator ();

Libreras del .NET Framework

FUOC P08/B0036/01628

44

La clase XPathNavigator contiene diferentes mtodos para navegar por los


nodos del documento: MoveToFirstChild, MoveToAttribute, MoveToNext, MoveToParent, MoveToPrevious, MoveToRoot, etc. Tambin ofrece propiedades para acceder a la informacin del nodo actual: NodeType,
Name, HasAttributes, Values, etc.
Para realizar consultas XPath, la clase XPathNavigator proporciona el mtodo Select, que recibe la expresin XPath en forma de string, y que devuelve una instancia de XPathNodeIterator. Esta clase, a su vez, permite iterar
sobre los nodos devueltos por la consulta realizada:
XPathNodeIterator it = nav.Select ("/parking/coche");
La clase XPathNodeIterator proporciona el mtodo MoveNext que sita el
iterador en el nodo siguiente. Para consultar el nodo actual, utilizamos la propiedad Current, que devuelve una instancia de XPathNavigator (la instancia con la que se cre el XPathNodeIterator), situado en la posicin correspondiente al nodo actual del iterador. El siguiente ejemplo muestra cmo iterar sobre los nodos resultantes de la consulta y mostrar el nombre del nodo
y su contenido:
while (it.MoveNext ())
{
Console.WriteLine (it.Current.Name+" "+it.Current.Value);
}

La clase XPathNavigator tambin incluye, a partir de la versin 2.0 del .NET


Framework, algunos mtodos que permiten editar el documento, entre otros
AppendChild, InsertAfter o InsertBefore. Para poder utilizar estos
mtodos es necesario crear la instancia de XPathNavigator a partir de una
instancia de XmlDocument en vez de un XPathDocument.
Estos mtodos de edicin reciben como parmetro un string, un objeto XmlReader o un objeto XmlPathNavigator que contienen el nodo que se va a
aadir. El siguiente ejemplo muestra cmo aadir un elemento coche al elemento principal coches:
XmlDocument doc = new XmlDocument();
doc.Load("in.xml");

XPathNavigator nav = doc.CreateNavigator();

nav.MoveToChild ("coches", "");

nav.AppendChild("<coche color='azul'></coche>");
nav.MoveToChild("coche", "");
nav.AppendChild("<marca>SEAT</marca>");

Libreras del .NET Framework

FUOC P08/B0036/01628

45

nav.AppendChild("<modelo>LEON</modelo>");

doc.Save("out.xml");

Estos mtodos tienen adems una versin que devuelve un XmlWriter en


el que se pueden escribir los elementos que se van a aadir, por ejemplo, el
siguiente cdigo tendra el mismo efecto que el anterior:
XmlDocument doc = new XmlDocument();
doc.Load("in.xml");

XmlWriter xw = nav.AppendChild();

XPathNavigator nav = doc.CreateNavigator();


nav.MoveToChild ("coches", "");

xw.WriteStartElement("coche");
xw.WriteAttributeString("color", "azul");
xw.WriteStartElement("marca");
xw.WriteString("SEAT");
xw.WriteEndElement();
xw.WriteStartElement("modelo");
xw.WriteString("LEON");
xw.WriteEndElement();
xw.WriteEndElement();

xw.Close();

doc.Save("out.xml");

Las modificaciones realizadas por el elemento XPathNavigator se reflejan


automticamente en el objeto XmlDocument sobre el que se ha creado, de
forma que al ejecutar el mtodo Save del XmlDocument se estn grabando en
el fichero de destino los cambios realizados.
Tambin es posible grabar en un fichero el contenido de un objeto XPathNavigator mediante la clase XmlWriter. Por ejemplo, el siguiente cdigo permite grabar el resultado de una consulta XPath que selecciona todos los nodos
marca del documento de coches:
XPathDocument doc = new XPathDocument ("in.xml");

XPathNavigator nav = doc.CreateNavigator();

XPathNodeIterator nodes = nav.Select("//marca");

XmlWriterSettings s = new XmlWriterSettings ();

Libreras del .NET Framework

FUOC P08/B0036/01628

46

s.ConformanceLevel = ConformanceLevel.Fragment;

XmlWriter writer = XmlWriter.Create("out.xml", s);

foreach (XPathNavigator node in nodes)


{
writer.WriteNode(node, true);
}

writer.Close();

Dado que el resultado no es un fichero XML, sino una secuencia de elementos


<marca>, hemos de indicar al XmlWriter que los elementos que vamos a
grabar en el fichero son slo fragmentos de un documento XML, ya que si
no se producira un error, porque el documento grabado no tiene el formato
correcto. Para indicar esto, utilizamos la propiedad ConformanceLevel de un
objeto XmlWriterSettings, que pasamos como parmetro al crear el objeto
XmlWriter. El valor indicado, en este caso, es Fragment de la enumeracin
ConformanceLevel.
4.5. XSLT
El .NET Framework incluye la clase XslCompiledTransform dentro del namespaceSystem.Xml.Xsl, que permite realizar transformaciones XSLT en documentos XML. Para ello, creamos un objeto de esta clase, y cargamos el fichero de estilo .xsl:
XslCompiledTransform tr = new XslCompiledTransform ();
tr.Load ("estilo.xslt");

Tambin se puede utilizar el mtodo Load pasando un objeto XmlDocument


que contenga el documento .xsl como parmetro.
Por otro lado, el mtodo Transform de la clase XslCompiledTransform es
el que permite aplicar una transformacin sobre un documento XML. Este
mtodo acepta bsicamente dos parmetros: el documento de origen que se
quiere transformar y el documento en el que se va a almacenar el resultado.
Como documento de origen se puede indicar el nombre del documento o
pasar un objeto de tipo XmlNode o XPathDocument con el documento ya
cargado. En cuanto al documento resultado, se puede guardar directamente
en un fichero indicado o utilizar un objeto XmlWriter.
El siguiente ejemplo utiliza un objeto tr de tipo XslCompiledTransform
con el documento de estilos ya cargado, para transformar un documento XML
almacenado en el objeto docorigen de tipo XmlDocument:

Libreras del .NET Framework

FUOC P08/B0036/01628

47

Libreras del .NET Framework

tr.Transform (docorigen, "destino.xml");


Tambin podemos indicar, directamente, el nombre del fichero de origen en
vez de pasar un objeto de tipo XmlDocument:
tr.Transform ("origen.xml", "destino.xml");

Recurso web
Se puede encontrar ms informacin acerca del uso de
transformaciones XSLT en
.NET en la siguiente direccin:
<http://
msdn2.microsoft.com/en-us/
library/14689742.aspx>

FUOC P08/B0036/01628

48

5. Otras utilidades del framework

La librera de clases contiene muchsimas otras utilidades que no podemos


explorar en profundidad aqu. A continuacin, se muestra una lista de las ms
importantes:

System.Threading. Contiene utilidades para la programacin de flujos de


ejecucin o threads.

System.Reflection. Las clases de este namespace permiten inspeccionar metadatos de ensamblados e invocar mtodos, en tiempo de ejecucin.

System.Data. Este namespace del .NET Framework contiene la funcionalidad de ADO.NET para acceder a fuentes de datos.

System.Net. Contiene funcionalidades de red.

System.Security. Dentro de este namespace encontramos diferentes funcionalidades relacionadas con la seguridad: gestin de permisos, criptografa,
etc.

System.Web. Las funcionalidades que permiten crear aplicaciones web


con ASP.NET se encuentran dentro de este namespace. El subnamespace
System.Web.Services contiene las funcionalidades para crear servicios Web
XML basados en pginas ASP.NET.

System.Windows. Contiene las funcionalidades para desarrollar aplicaciones de WinForms.

Libreras del .NET Framework

FUOC P08/B0036/01628

49

Actividades
1.Ejecutadlassiguientesacciones:
Cread un mtodo sumar, que reciba dos parmetros de tipo object, convierta los dos
parmetros a tipo entero y devuelva la suma de nuevo como object.
Cread un mtodo que calcule el volumen de una esfera, indicando el radio como par-

metro. (NOTA: el volumen de la esfera se calcula como (4 * * r3) / 3).


Cread el mtodo DoubleConvert que reciba un parmetro de tipo object y devuelva el
valor double equivalente al valor numrico representado por el parmetro.
Cread el mtodo NumeroGanador que devuelva uno de los nmeros ganadores de la
lotera primitiva (entre 1 y 49).

2.Ejecutadlassiguientesacciones:
Cread un mtodo que reciba un parmetro de tipo object, que convierta ese objeto en
un string.
Cread un mtodo que calcule el reverso de una cadena de caracteres (que de la vuelta a
la secuencia de caracteres).
Cread un mtodo que devuelva la vocal que aparece ms veces en una cadena de caracteres.
Cread el mtodo PrimeraLetraEnMayusculas que reciba un string como parmetro
y que devuelva este mismo string poniendo en maysculas la primera letra de cada
palabra y en minsculas el resto de caracteres.
Reescribid el mtodo que calcula el reverso de un string pero con la clase StringBuilder, de forma que la inversin se realice en la misma cadena que se pasa como parmetro.
3.Ejecutadlassiguientesacciones:
Cread el mtodo DiasTotales que calcule el nmero de das que han pasado desde el
inicio del calendario hasta una fecha indicada como parmetro.
Cread el mtodo FechaFinal que reciba como parmetro un objeto DateTime y un
objeto TimeSpan, y que devuelva el DateTime correspondiente a sumar la fecha y el
intervalo de tiempo especificados.
4.Ejecutadlassiguientesacciones:
Cread el mtodo SumarATodos que sume a todas las posiciones de un array de enteros,
un valor indicado.
Cread el mtodo ReverseMatrix, que invierta una matriz de enteros rectangular de 2
dimensiones, es decir, que devuelva una matriz en la que las filas de la matriz inicial
pasen a ser las columnas de la nueva y las columnas las filas.
5.Ejecutadlassiguientesacciones:
Cread un ArrayList e insertar varios elementos de tipo string.
Insertad un elemento en la posicin 1 de la coleccin anterior.
Cread un Hashtable e insertad varios pares <string, DateTime>.
Eliminad uno de los elementos de la coleccin anterior.
Cambiad las colecciones anteriores por sus correspondientes colecciones genricas.
6.Ejecutadlassiguientesacciones:
Escribid el mtodo EscribirString que reciba dos string como parmetro. El primer
string indica el nombre de un fichero que se quiere crear o sobrescribir, y el segundo
indica la cadena de caracteres que se quiere grabar en el fichero.
Escribid el mtodo LeerString que devuelva un string con el contenido del fichero
indicado como parmetro.
Escribid el mtodo Buscar con dos parmetros de tipo string. El primer parmetro
indica un path a partir del cual se quiere realizar la bsqueda. El segundo indica una
cadena de caracteres que se quiere buscar. El mtodo debe devolver el nmero de veces
que aparece la cadena indicada en el segundo parmetro en los nombres de ficheros y
directorios incluidos dentro del directorio indicado en el primer parmetro (incluidas
subcarpetas).
7.Ejecutadlassiguientesacciones:
Aadid el campo coches de tipo ArrayList a la clase Conductor.
Aadid nuevos elementos Coche a la coleccin anterior.
Eliminad un elemento de la coleccin.
Insertad un elemento en una posicin concreta de la coleccin.
Cambiad el ArrayList por un HashTable. Reescribid las instrucciones de los apartados
2, 3 y 4 para esta nueva coleccin.
8.Ejecutadlassiguientesacciones:
Implementad el tipo genrico cola de pares <T, S>, es decir, una cola en la que en cada
posicin se almacena un struct que contiene un campo de tipo T y otro de tipo S.

Libreras del .NET Framework

FUOC P08/B0036/01628

50

Probad el tipo creado aadiendo y quitando elementos.

9.Ejecutadlassiguientesacciones:
Abrid un fichero de texto y escribid una secuencia de caracteres introducida por el usuario. Al final cerrad el fichero.
Abrid el fichero creado en el apartado anterior y mostrad su contenido por pantalla.

Libreras del .NET Framework

FUOC P08/B0036/01628

51

Bibliografa
MSDM Visual Studio 2005 Developer Center. "Reading XML with the XmlReader". .NET
Framework Developer's Guide.
http://msdn2.microsoft.com/en-us/library/9d83k261(VS.80).aspx
MSDN Visual Studio 2005 Developer Center. "Validating XML Data with XmlReader".
.NET Framework Developer's Guide.
http://msdn2.microsoft.com/en-us/library/hdf992b8.aspx
MSDN Visual Studio 2005 Developer Center. "Writing XML with the XmlWriter". .NET
Framework Developer's Guide.
http://msdn2.microsoft.com/enus/library/4d1k42hb(VS.80).aspx
MSDN Visual Studio 2005 Developer Center. " XSLT Transformations". .NET Framework
Developer's Guide.
http://msdn2.microsoft.com/en-us/library/14689742.aspx
Nagel, C.; Evjen, B.; Glynn, J. y otros (2005). Professional C# with 3.0. Wrox.
Wigley, A.; Wheelwright, S. (2003) .NET Compact Framework Core Reference. MSPress.
W3C. Arquitecture Domain.Document Object Model (DOM).
http://www.w3.org/DOM/
.NET Compact Framework Developer Center
http://msdn.microsoft.com/netframework/programming/netcf/default.aspx
.NET Framework Developer's Guide
http://msdn2.microsoft.com/en-us/library/f44bbwa1.aspx
.NET Compact Framework QuickStart Tutorial
http://samples.gotdotnet.com/quickstart/CompactFramework/

Libreras del .NET Framework

También podría gustarte