Hero

Leer XML con LinQ en C# con .Net

Julio 16, 2013

Pablo
C#
Microsoft
.Net

Algunas veces ocupamos acceder desde nuestras aplicaciones a información que se encuentran en archivos con formato XML, afortunadamente el Framework de .Net nos brinda herramientas para trabajar con esta clase de archivos, sin embargo leer estos archivos línea por línea requiere mucho trabajo.

Es por esto que una buena opción es utilizar las librerías LinQ que nos permiten acceder a la información como si esta se encontrara en una base de datos. A continuación voy a mostrar el proceso de como usar LinQ.

  1. Crear clase que almacenará los datos del XML.

Debemos crear una nueva clase con los atributos y métodos que se requieran para procesar el archivo XML como se muestra en el siguiente listado de código. Para este ejemplo se guardará información general de vídeo juegos.

En la clase tendrá los métodos set y get para almacenar y obtener los atributos de la clase, además sobre-escribí el método toString, en el cual se imprimen los atributos de la clase, esto con el único motivo de poder obtener los datos del objeto sin tener que llamar a sus propiedades una por una, sino solamente utilizar la instancia del objeto.

<pre title="Entidad que encapsulará la información del XML">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EjemploXML{
    class Juego{
        private int idJuego;
        private String nombreJuego;
        private String generoJuego;
        private String plataformaJuego;
        private String companiaCreadora;

        /// <summary>
        /// Metodo constuctor sin parametros.
        /// </summary>
        public Juego( ) { 
        }//Fin de metodo constructor sin parametros.

        /// <summary>
        /// Metodo constructor con parametros.
        /// </summary>
        /// <param name="idJuego">identificador del juego</param>
        /// <param name="nombreJuego">nombre del juego</param>
        /// <param name="generoJuego">genero del juego</param>
        /// <param name="plataformaJuego">plataforma del juego</param>
        /// <param name="companiaJuego">nombre de la compania del juego</param>
        public Juego( int idJuego, String nombreJuego, String generoJuego, String plataformaJuego, String companiaJuego ){
            this.IdJuego = idJuego;
            this.NombreJuego = nombreJuego;
        }//Fin de metodo constructor.

        public int IdJuego{
            get{
                return idJuego;
            }//Fin de get.
            set{
                idJuego = value;
            }//Fin de set.
        }//Fin de propiedad IdJuego.

        public String NombreJuego {
            get{
                return nombreJuego;
            }//Fin de get.
            set{
                nombreJuego = value;
            }//Fin de set.
        }//Fin de propiedad NombreJuego.

        public String GeneroJuego{
            get{
                return generoJuego;
            }//Fin de get.
            set{
                generoJuego = value;
            }//Fin de set.
        }//Fin de propiedad GeneroJuego.

        public String PlataformaJuego {
            get {
                return plataformaJuego;
            }//Fin de get
            set {
                this.plataformaJuego = value.Trim( );
            }//Fin de set.
        }//Fin de propiedad PlataformaJuego.

        public String CompaniaCreadora{
            get{
                return companiaCreadora;
            }//Fin de get
            set{
                this.companiaCreadora = value.Trim();
            }//Fin de set.
        }//Fin de propiedad CompaniaCreadora.

        public override String ToString(){
            return "-----------------Juego------------------\n ID= " + IdJuego + "\n Nombre=" + NombreJuego + "\n Genero= " + GeneroJuego + "\n Compañia= " + CompaniaCreadora + "\n----------------------------------------";
        }

    }//Fin de clase.
}
  1. Definir archivo XML.

Para este ejemplo crearemos el XML con la información y se obtiene su dirección de la computadora por ejemplo del escritorio, o su dirección en la solución, en este caso se encontrara en el escritorio y el archivo sería el siguiente.

<pre title="Archivo XML a leer"><?xml version="1.0" encoding="UTF-8"?>
<juegos>
	<juego id="01">
		<nombre>
			Heroes Of Might Magic VI
		</nombre>
		<genero>
			RPG
		</genero>
		<plataforma>
			PC
		</plataforma>
		<companiaCreadora>
			Ubisoft
		</companiaCreadora>
	</juego>
	<juego id="02">
		<nombre>
			Starcraft II: Wings of Liberty
		</nombre>
		<genero>
			Estrategia
		</genero>
		<plataforma>
			PC
		</plataforma>
		<companiaCreadora>
			Blizzard Entertainment
		</companiaCreadora>
	</juego>
	<juego id="03">
		<nombre>
			Batman: Arkham Asylum
		</nombre>
		<genero>
			Aventura
		</genero>
		<plataforma>
			PC
		</plataforma>
		<companiaCreadora>
			Eidos
		</companiaCreadora>
	</juego>
</juegos>
  1. Obtener la información del archivo.

Para el ejemplo se agregara al namespace EjemploXML una clase llamada XMLReader, aquí es donde se hace uso del LinQ para procesar al archivo XML como si fuera una base de datos, obteniendo la información por medio de una consulta.

<pre title="Clase XMLReader">namespace EjemploXML{
    class XMLReader{

        public List<Juego> leerXML( ){
            var consulta =
                from juego in XElement.Load("C:\\Users\\Pablo\\Desktop\\XML\\Juegos.XML").Elements("juego")//Ponemos la direccion del archivo y el nombre de los elementos que queremos obtener
                select new Juego{
                    IdJuego = Convert.ToInt32(Convert.ToString( juego.Attribute("id").Value ).Trim( ) ),
                    NombreJuego = Convert.ToString( juego.Element( "nombre" ).Value ).Trim( ),
                    GeneroJuego = Convert.ToString(juego.Element( "genero" ).Value ).Trim( ),
                    PlataformaJuego = Convert.ToString(juego.Element( "plataforma" ).Value ).Trim( ),
                    CompaniaCreadora = Convert.ToString(juego.Element( "companiaCreadora" ).Value ).Trim( )
                };//Fin de consulta.
            List<Juego> juegos = consulta.ToList<Juego>();
            return juegos;
        }//Fin de metdo leerXML.

    }//Fin de clase.
}

Luego simplemente se hace uso de la información ya guardada en una lista, para el ejemplo imprimiremos los datos en la CMD de Windows, llamando a la consola de la librería System, por medio de la cual le decimos al sistema operativo que abra una consola e imprima la información de los juegos.

<pre title="Se hace uso de la información">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EjemploXML{
    class Program{
        static void Main(string[] args){
            foreach( Juego juego in new XMLReader().leerXML() ){
                Console.WriteLine( juego ); 
            }//Fin de foreach.

            //Para detener la aplicación solamente.
            Console.ReadLine(); 
        }//Fin de metodo main.
        
    }//Fin de clase.
}
  1. Resultado:

Resultado de imprimir a pantalla un archivo XML con LinQ

Para los que utilizan Visual Basic .Net, utilizar LinQ para obtener los datos guardados en un XML es muy similar solo cambia el objeto que se utiliza para obtener los elementos en C# se utiliza XElement y en VisualBasic se utiliza XDocument, a continuación se muestra la instrucción que cambia en la clase XMLReader

En C# como se muestra a continuación:

XElement.Load("C:\\Users\\Pablo\\Desktop\\XML\\Juegos.XML").Elements("juego")

Y en VisualBasic se utiliza:

 xml As XDocument = XDocument.Load(getResourseStream("C:\\Users\\Pablo\\Desktop\\XML\\Juegos.XML")).Descendants("juego") 

El resto de cambios serian de sintaxis de los lenguajes pero es prácticamente el mismo procedimiento.

Espero que este ejemplo les sea de ayuda!! :D

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.