Como leer XML con C#

   La importancia de XML en la informática actual está fuera de cualquier tipo de duda. Dentro de la plataforma .NET XML  tiene un papel principal, gran parte de la architectura de .NET trabaja internamente con XML, ADO.NET, WebServicesSOAPASP.NET ...

   Otro de los papeles principales de la plataforma .NET corresponde a C#.Por este motivo es fundamental para cualquier programador de C# conocer y utilizar las clases que permiten leer y manipular archivos XML.

   La plataforma .NET ofrece una nueva interfaz de acceso a datos XML, el namespace System.XML, que sustituye a la anterior interfaz de Microsoft, SAX, aunque se puede continuar utilizando agregando una referencia a MSXML3.DLL en nuestro proyecto, si bien SAX es una interfaz basada en COM por lo necesitariamos crear una ensamblado de interoperatividad. 

   Este articulo esta orientado a la lectura de un archivo XML desde C# con las clases de System.XML, usando código controlado. Se supone que el lector tiene un conocimiento mínimo de XML.

   Supongamos un fichero XML como este, llamado personas1.xml,  en el que se define una estructura de personas, compuesta por nodos persona, con nombre, apellido1 y apellido2


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


<
personas>

<persona>

<nombre>Devjoker!</nombre>

<apellido1>El apellido de Devjoker</apellido1>

<apellido2>El segundo apellido de Devjoker</apellido2>

</persona>

<persona>

<nombre>Otra persona</nombre>

<apellido1>Apellido 1 de otra persona</apellido1>

<apellido2>Apellidos 2 de otra persona</apellido2>

</persona>

</personas>

   Si analizamos un poco el documento XML veremos que tenemos un nodo principal, <personas>, de este nodo dependen dos nodos <persona> , del que a su vez dependen los nodos <nombre>, <apellido1>,<apellido2> .

   Lo primero que debemos hacer es importar el namespace System.Xml que contiene las clases que nos van a servir para trabajar con el documento XML.

    A continuación tenemos un ejemplo de código para leer el fichero desde c#, lógicamente la ruta del fichero está referida a mi equipo de trabajo, por lo que debemos cambiarla ...


using
System;

using System.Xml;

namespace xmltest

{

class Program

{

static void Main(string[] args)

{

XmlDocument xDoc = new XmlDocument();

//La ruta del documento XML permite rutas relativas
//respecto del ejecutable!

xDoc.Load("../../../../personas1.xml");

XmlNodeList personas = xDoc.GetElementsByTagName("personas");

XmlNodeList lista =
((
XmlElement)personas[0]).GetElementsByTagName("persona");

foreach (XmlElement nodo in lista)

{

int i=0;

XmlNodeList nNombre =
nodo.GetElementsByTagName(
"nombre");

XmlNodeList nApellido1 =
nodo.GetElementsByTagName(
"apellido1");

XmlNodeList nApellido2 =
nodo.GetElementsByTagName(
"apellido2");

Console.WriteLine("Elemento nombre ... {0} {1} {2}"
                             
nNombre[i].InnerText,
                             nApellido1[i].InnerText,
                             nApellido2[i++].InnerText);

}

}

}

}

   Vamos a comentar un poco el código. La primera clase de la que vamos a hablar es XmlDocument. La clase XmlDocument representa el documento XML y dispone de un método Load para cargar el documento desde un archivo, una secuencia o un XmlReader. En nuestro ejemplo hemos utilizado el método que recibe un archivo como parámetro (la ruta está referida de forma relativa al directorio donde se ejecuta el exe). La clase XmlDocument es una implementación del modelo de objetos de documentos (DOM) del W3C. El W3C es el organismo que regula el estandar XML.

   El siguiente fracmento de código ilusta la carga del documento XML en el objeto XDoc, instancia de XmlDocument.


XmlDocument
xDoc = new XmlDocument();

//La ruta del documento XML permite rutas relativas
//respecto del ejecutable!

xDoc.Load("../../../../personas1.xml");

    A continuación invocamos al método GetElementsByTagName de la instancia de XmlDocument para obtener un objeto XmlNodeList. Este método devuelve una coleccion de objetos XmlNode. Cada objeto XmlNode representa un nodo del documento XML.

   Una vez que tenemos el nuestra referencia al nodo de personas, obtenemos un nuevo XmlNodeList, con todos los nodos persona dependientes del nodo personas. Recorremos este nuevo nodo mostrando por pantalla el contenido de los nodos nombre, apellido1 y apellido2.


XmlNodeList
personas = xDoc.GetElementsByTagName("personas");

XmlNodeList lista =
((
XmlElement)personas[0]).GetElementsByTagName("persona");

foreach (XmlElement nodo in lista)

{

int i=0;

XmlNodeList nNombre = nodo.GetElementsByTagName("nombre");

XmlNodeList nApellido1 = nodo.GetElementsByTagName("apellido1");

XmlNodeList nApellido2 = nodo.GetElementsByTagName("apellido2");

Console.WriteLine("Elemento nombre ... {0} {1} {2}"
                             
nNombre[i].InnerText,
                             nApellido1[i].InnerText,
                             nApellido2[i++].InnerText);

}

   Como podemos ver el ejemplo es muy sencillo, y solo ofrece una aproximación a lo que nos ofrece el namespace System.XML.

   Otra forma en la que habitualmente se escriben los fichero XML es en filas. El mismo fichero anterior pero expresado en filas tendría el siguiente aspecto. Lo guardaremos como


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

<personas>
  <persona nombre="Devjoker" apellido1="El apellido1"
apellido2
="El apellido1" />
  <persona nombre="Otro nombre" apellido1="Otro apellido1"
apellido2
="Otro apellido2" />
</personas>


   El siguiente programa es una adaptación del anterior para tratar el documento XML personas2.xml. La única diferencia con el programa anterior radica en que antes, el nombre y apellidos se exponian como nodos, y en este como atributos, por lo que el método utilizado para su lectura es GetAttribute en lugar de GetElementsByTagName.


using
System;

using System.Xml;

namespace xmltest

{

class Program

{

static void Main(string[] args)

{

XmlDocument xDoc = new XmlDocument();

//La ruta del documento XML permite rutas relativas

//respecto del ejecutable!

xDoc.Load("../../../../personas2.xml");

XmlNodeList personas = xDoc.GetElementsByTagName("personas");

XmlNodeList lista =
((
XmlElement)personas[0]).GetElementsByTagName("persona");

foreach (XmlElement nodo in lista)

{

string nNombre = nodo.GetAttribute("nombre");
//.GetElementsByTagName("nombre");

string nApellido1 = nodo.GetAttribute("apellido1");

string nApellido2 = nodo.GetAttribute("apellido2");

Console.WriteLine("Elemento nombre ... {0} {1} {2}",
nNombre, nApellido1,nApellido2);

}

}

}

}

   Espero que este articulo os sirva de introducción al namespace System.XML y el uso de C# con XML.

Saludos, DJK

Pedro  Herrarte  Sánchez
Como leer XML con C#
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:09/05/2006
Última actualizacion:09/05/2006
Visitas totales:200385
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com