5-Librerias NET Framework (Español)
5-Librerias NET Framework (Español)
5-Librerias NET Framework (Español)
NET Framework
David Gan Jimnez
P08/B0036/01628
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 .............................................................................. 1.5. System.Random ......................................................................... 1.6. System.String ............................................................................. 1.7. System.DateTime ....................................................................... 1.8. System.TimeSpan ....................................................................... 1.9. System.Exception ...................................................................... 1.10.System.Array .............................................................................. 1.11.System.Environment ................................................................. 2. Colecciones de datos (System.Collections)............................... 2.1. ArrayList .................................................................................... 2.2. Hashtable ................................................................................... 2.3. Queue y Stack ........................................................................... 2.4. Colecciones genricas (System.Collections.Generic) ................ 3. Entrada/Salida (System.IO)......................................................... 4. XML (System.Xml)......................................................................... 4.1. XmlReader y XmlWriter ........................................................... 4.1.1. Lectura de documentos XML con XmlReader ............... 4.1.2. Escritura de documentos XML con XmlWriter ............. 4.2. DOM (Document Object Model) .............................................. 4.2.1. Estructura de DOM ........................................................ 4.2.2. Lectura de un documento XML con DOM ................... 4.2.3. Navegar por un documento XML con DOM ................. 4.2.4. Consultar las propiedades de un nodo .......................... 4.2.5. Modificacin de un documento XML con DOM .......... 4.2.6. Escritura de un documento XML con DOM ................. 4.3. Validacin de documentos XML .............................................. 4.3.1. Validacin del documento XML ................................... 4.4. XPath ......................................................................................... 4.5. XSLT ...........................................................................................
5 6 7 7 8 9 10 10 11 15 16 17 17 21 23 23 24 25 26 28 32 32 32 34 35 35 36 37 38 38 40 40 41 43 46
FUOC P08/B0036/01628
48 49 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.
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.
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) {
FUOC P08/B0036/01628
GetHashCode. Devuelve un nmero de hash que se utiliza para almacenar el objeto en tablas de hash (por ejemplo la coleccin Hashtable ). Idealmente, el nmero debe de ser diferente para instancias que representan objetos diferentes.
1
(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.
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 sbyte byte char short ushort int uint Estructura SByte Byte Char Int16 UInt16 Int32 UInt32 Descripcin nmero entero de 8 bits con signo nmero entero de 8 bits sin signo carcter unicode de 16 bits nmero entero de 16 bits con signo nmero entero de 16 bits sin signo nmero entero de 32 bits con signo nmero entero de 32 bits sin signo
FUOC P08/B0036/01628
Descripcin nmero entero de 64 bits con signo nmero entero de 64 bits sin signo nmero real nmero real de gran precisin nmero de 128 bits 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.
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).
FUOC P08/B0036/01628
11
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.
FUOC P08/B0036/01628
12
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";
Bsqueda en strings: IndexOf. Devuelve la posicin de la primera aparicin de una subcadena dentro de un string: string s = "Esto es un string";
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);
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"
Relacionada con la clase string, la clase StringBuilder del namespace System.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] = '#';
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);
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.
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);
FUOC P08/B0036/01628
18
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;
FUOC P08/B0036/01628
19
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;
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
FUOC P08/B0036/01628
20
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, 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; }
new
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
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.
FUOC P08/B0036/01628
23
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.
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);
FUOC P08/B0036/01628
25
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);
FUOC P08/B0036/01628
26
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 List<T> Dictionary<K,V> Queue<T> Stack<T> SortedList<T> Coleccinequivalente ArrayList Hastable Queue Stack 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);
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.
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.
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-
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);
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);
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.
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.
FUOC P08/B0036/01628
31
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)); }
foreach (FileInfo fi in di.GetFiles ()) { if (fi.Extension == "txt") { fi.MoveTo (Path.Combine (fi.DirectoryName, lastname.ToString() + ".txt")); lastname++; } }
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.
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");
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);
FUOC P08/B0036/01628
33
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));
FUOC P08/B0036/01628
34
4.1.2.
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.
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>
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 ();
FUOC P08/B0036/01628
35
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 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
(2)
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 namespace System.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.
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:
FUOC P08/B0036/01628
37
4.2.3.
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-
FUOC P08/B0036/01628
38
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");
FUOC P08/B0036/01628
40
4.2.6.
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-
FUOC P08/B0036/01628
41
do por el namespace URI-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;
FUOC P08/B0036/01628
42
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:
settings.ValidationEventHandler +=
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>
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']");
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 ();
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");
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();
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");
FUOC P08/B0036/01628
46
s.ConformanceLevel = ConformanceLevel.Fragment;
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:
FUOC P08/B0036/01628
47
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
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.
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.
FUOC P08/B0036/01628
50
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.
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/