3.1.Un xml como DataSet

En este post explicaremos como podemos utilizar un xml como dataset en un informe.

Para este ejemplo utilizaremos el xml que encontraremos en la siguiente URL.

http://www.w3schools.com/xml/simple.XML

Vamos a empezar.

Creamos un proyecto donde añadiremos un report en éste y agregamos un método (en mi caso lo he llamado XxmlDataSet) que será el que nos devuelva los datos que se mostrará en el informe.


Presionamos Enter o dos clicks con el ratón sobre el método para que nos cree las clases BusinessLogic.

Modificaremos el método que nos crea por defecto con el siguiente código.

using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.Data;
using Microsoft.Dynamics.Framework.Reports;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;

public partial class XMLReport
{
    [DataMethod(), PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public static DataTable xmlDataSet()
    {
        DataTable dt = new DataTable();

        dt.Columns.Add("name", typeof(string));
        dt.Columns.Add("price", typeof(string));
        dt.Columns.Add("description", typeof(string));
        dt.Columns.Add("calories", typeof(string));

        XDocument xdoc = XDocument.Load("http://www.w3schools.com/xml/simple.xml");

        var q = from c in xdoc.Descendants("food")
       
                select new
                {
                    name          = c.Element("name").Value,
                    price           = c.Element("Price").Value,
                    description = c.Element("description").Value,
                    calories      = c.Element("calories").Value
                };

                foreach (var obj in q)
                {
                    dt.Rows.Add(obj.name,
                                          obj.price,
                                          obj.description,
                                          obj.calories);
                }

        return dt;   
    }
}

Como suelo hacer vamos a explicar el funcionamiento del método.

En la parte superior del método están los using (referencias) necesarias para trabajar con las clases .NET y con los XML.
Entre las más destacadas está la referencia a Linq (Language integrated Query), lo que nos permitirá realizar consultas sobre el xml.

using System.Linq;
using System.Xml;
using System.Xml.Linq;

El siguiente paso es declararnos una variable de tipo DataTable que será nuestro dataset en el informe.

DataTable dt = new DataTable();

dt.Columns.Add("name", typeof(string));
dt.Columns.Add("price", typeof(string));
dt.Columns.Add("description", typeof(string));
dt.Columns.Add("calories", typeof(string));

A nuestra variable dataTable le agregaremos las columnas necesarias para nuestro dataSet, esto lo haremos mediante la función Add.

Si observamos el xml he creado tantas columnas en nuestro dataSet como subnodos tiene el nodo food.
 
Nota: El nombre de las columnas en nuestro dataset no tiene porque ser el mismo que el nombre de los nodos del xml, en éste caso para que quede claro todo,  yo he utilizado el mismo, pero no tiene porque ser así.
 
Ahora comenzaremos a trabajar con nuestro xml.

Primero declaramos una variable de tipo XDocument que almacenará nuestro xml.
Para este ejemplo utilizaremos una URL.

XDocument xdoc = XDocument.Load("http://www.w3schools.com/xml/simple.xml");

Nota: Recordad de agregar las referencias (using) que os he indicado ya que sin éstas no funcionará.

El siguiente paso será almacenar en una variable los datos devueltos de la consulta.
Básicamente le estamos diciendo que nos devuelva todos los subnodos cuyo nodo principal sea food.

Para que quede claro le estamos diciendo que nos devuelva los nodos name, Price, description y calories.

var q = from c in xdoc.Descendants("food")

Le indicaremos los elementos que queremos recuperar del xml, éto creará los siguientes objetos en la consulta:
       
select new
{
        name          = c.Element("name").Value,
        price           = c.Element("Price").Value,
        description = c.Element("description").Value,
        calories      = c.Element("calories").Value
};


Nota: Le he agregado los cuatro objetos pero no tiene porque ser así.

A continuación se recuperará los objetos de la consulta e ir agregándolos a las filas del informe.

foreach (var obj in q)
{
       dt.Rows.Add(obj.name,
                              obj.price,
                              obj.description,
                              obj.calories);
}


Finalmente devolveremos nuestra variable.

return dt;   

Volviendo a nuestro informe.

En las propiedades de nuestro dataset le indicaremos como tipo de datasource Business logic y en la query el método que acabamos de crear.

 
 
En la propiedad query del dataset al clickar para seleccionar el método se nos abrirá un formulario, como el de la imagen de abajo, donde seleccionaremos el método que nos devolverá los datos.
 

 
 
 
Recordad que si presionamos el icono "!" de la parte superior ejecutará el método, si nos da algún error o no devuelve datos los más probable es que el método no sea correcto.
 
En el dataSet deberían aparecer los campos que creamos en el método, sino es así lo refrescaremos.
 
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("price", typeof(string));
dt.Columns.Add("description", typeof(string));
dt.Columns.Add("calories", typeof(string));
 
 
 
 
Crearemos un diseño automatico muy simple para poder probar nuestro informe.
 
 
Si hacemos una previsualización veremos el report con los datos de nuestro xml.
 
 
 
En este post hemos leído un fichero xml desde una url utilizando el siguiente código.
 
XDocument xdoc = XDocument.Load("http://www.w3schools.com/xml/simple.xml");
 
Podríamos utilizar este mismo ejemplo para leer un xml desde un fichero almacenado en nuestro disco duro.
Tan solo deberíamos cambiar la línea anterior por la que sigue.
 
XDocument xdoc = XDocument.Load(@"c:\simple.xml");
 
 
 


Comentarios