Lectura de datos XML

18. December 2008 15:23 by Oscar.SS in XML  //  Tags:   //   Comments (2)

En el espacio de nombres System.Xml tenemos a nuestra disposición multitud de clases que nos permiten el manejo, escritura y lectura de los archivos XML. En este artículo nos centraremos en la lectura de los datos almacenados en un archivo XML.

Supongamos que tenemos un archivo XML que guarda los datos de los empleados de una empresa. Estos datos podrían ser el nombre, los apellidos, el número de la seguridad social y el teléfono. Simplificando mucho el archivo podría tener la siguiente estructura:

 

<?xml version="1.0" encoding="utf-8" ?>
<empleados>
  <empleado>
    <idEmpleado>
1</idEmpleado>
    <nombre>Pedro</nombre>
    <apellidos>Martinez Segura</apellidos>
    <numeroSS>
111-111-111-111</numeroSS>
    <telefonos>
      <fijo>
913847913</fijo>
      <movil>
680432874</movil>
    </telefonos>
  </empleado>

  <empleado>
    <idEmpleado>
2</idEmpleado>
    <nombre>Amalia</nombre>
    <apellidos>García Pedrueza</apellidos>
    <numeroSS>
222-222-222-222</numeroSS>
    <telefonos>
      <fijo>
947895433</fijo>
      <movil>
678343221</movil>
    </telefonos>
  </empleado>

  <empleado>
    <idEmpleado>
3</idEmpleado>
    <nombre>Luis</nombre>
    <apellidos>Gómez Luta</apellidos>
    <numeroSS>
333-333-333-333</numeroSS>
    <telefonos>
      <fijo>
968454907</fijo>
      <movil>
678453248</movil>
    </telefonos>
  </empleado>
</empleados>

Lo que pretendemos es implementar un método que nos permita recuperar los datos de un empleado en función de un número (idEmpleado) introducido por el usuario de nuestra aplicación.

Para leer este documento vamos a utilizar los siguientes objetos:

  • XmlDocument. Representa el documento o archivo XML. Con este objeto cargaremos el archivo XML que pretendemos leer.
  • XmlNodeList. Representa una colección de nodos XML. Permite obtener todos los nodos de un tipo concreto especificado por una ruta XPath.
  • XmlNode.Representa un único nodo. Con él podremos acceder a su contenido, tanto si solo contiene una cadena de texto como si contine otros nodos (nodos hijos).

A grandes rasgos, la técnica a ejecutar es la siguiente. Primeramente obtenemos una lista con todos los empleados, de esta lista obtenemos el empleado en función del número introducido por el usuario. A continuación pasamos a recuperar los datos del empleado.

Aquí teneís una función que realiza esta tarea. No es la única forma de hacerlo, así que os aconsejo que investiguéis y encotréis por vuestros propios medios la forma que más comoda os resulte.

 

        public void ObtenerEmpleado(int numEmpleado)
        {
            
//Creamos un documento y lo cargamos con los datos del XML.
            
XmlDocument documento = new XmlDocument();
            
documento.Load("Ruta y nombre del archivo XML");

            
//Obtenemos una colección con todos los empleados.
            
XmlNodeList listaEmpleados documento.SelectNodes("empleados/empleado");

            
//Creamos un único empleado.
            
XmlNode unEmpleado;

            
//Recorremos toda la lista de empleados.
            
for (int 0i < listaEmpleados.Counti++)
            {
                
//Obtenemos cada empleado.
                
unEmpleado listaEmpleados.Item(i);

                
//Seleccionamos el id del empleado.
                
int idEmpleado Convert.ToInt32(unEmpleado.SelectSingleNode("idEmpleado").InnerText);

                
//Comprobamos que el id de empleado sea el mismo que el número introducido por el usuario.
                
if (numEmpleado == idEmpleado)
                {
                    Console.WriteLine()
;

                    
//Obtenemos el nombre.
                    
Console.WriteLine("Nombre: {0}", unEmpleado.SelectSingleNode("nombre").InnerText);

                    
//Obtenemos los apellidos.
                    
Console.WriteLine("Apellidos: {0}", unEmpleado.SelectSingleNode("apellidos").InnerText);

                    
//Obtenemos el número de la seguridad social.
                    
Console.WriteLine("N.S.S.: {0}", unEmpleado.SelectSingleNode("numeroSS").InnerText);

                    
//Obtenemos la lista de telefonos.
                    
XmlNodeList telefonos unEmpleado.SelectSingleNode("telefonos").ChildNodes;

                    
//Obtenemos el teléfono fijo y movil.
                    
XmlNode tlfFijo telefonos[0];
                    
XmlNode tlfMovil telefonos[1];

                    
Console.WriteLine("Teléfono fijo: {0}", tlfFijo.InnerText);
                    
Console.WriteLine("Teléfono movil: {0}", tlfMovil.InnerText);
                
}
            }
        }

Comments (2) -

George
George
10/7/2009 12:19:50 AM #

No se que estoy haciendo mal,

Pero me manda un orror que no puede insertar un nodo child en el mismo nivel

Si pueden ayudarme se los agradeceria.

Es el mismo codigo y archivo xml.

Saludos

Oscar.SS
Oscar.SS
10/8/2009 11:23:55 AM #

Hola George:

La verdad que con la información que me has dado poco puedo ayudarte. Pero da la sensación de que estás intentando insertar un nodo hijo en el nivel de un  nodo padre. Comprueba que recorres correctamente el árbol del XML.

De todas formas, en el siguiente artículo:

www.oscarsotorrio.com/.../Insertar-datos-XML.aspx

he incluido al final, una descarga con el código de ejemplo para que puedas comprobar como funciona. Espero que te sirva de ayuda.

¡Cuéntanos tus progresos!

Recent Comments

Comment RSS

Month List