martes, 1 de junio de 2010

[Linq to XML] Unir Documentos – Uso del Join

 

Introducción

El articulo muestra la forma en que se puede hacer uso de linq to xml para unir dos documentos xml diferentes, pero que poseen un dato en común como vinculo

Se podría decir que la unión seria similar a un “join” entre tablas, pero la diferencia esta en que es xml.

El resultado será la creación de una lista (de uan clase concreta) que podrá ser bindeada a una grilla.

 

Unión de las listas

Para el ejemplo se ha creado una clase custom que será usada en la defunción del tipo a devolver.

Esto es necesario ya que un tipo anónimo definido como “var”, no puede ser devuelto en una función, es necesario definir el tipo concreto.

public class Producto
{
    public string NumeroSerie {get; set;}
    public string Nombre {get; set;}
    public string Alquilado {get; set;}
    public string Modelo { get; set; }
}

El código linq usado es el siguiente:

private List<Producto> ProcesarXML()
        {
            string xml1 = @" <Nodos>
                             <Nodo s='122531715' m='0'>
                              <Model id='029A' m='210ED441A02' vn='2.27' vp='1.94' fd='12/11/2007 00:00:00' dad='0107' pass='2' />
                              <Info s='8' lpt='15/04/2010 01:00:00' let='01/04/2010 19:36:25' lc='29/05/2010 13:09:45' in='False' iim='True' />
                              <En E0='00000515' />
                              <ICP I0='0' />
                             </Nodo>
                             <Nodo s='122531717' m='0'>
                              <Model id='0290' m='210ED441A02' vn='2.27' vp='1.94' fd='23/10/2007 00:00:00' dad='0119' pass='2' />
                              <Info s='8' lpt='15/04/2010 01:00:00' let='02/04/2010 09:24:16' lc='29/05/2010 16:09:47' in='False' iim='True' />
                              <En E0='00000859' />
                              <ICP I0='0' />
                             </Nodo>
                            </Nodos>";



             string xml2 =@"<Parcelas>
                             <Parcela trafo='1' Sector='K'>
                              <ID>1</ID>
                              <Nombre>Par 1 Sec. K</Nombre>
                              <Numero>122531715</Numero>
                              <Alquilada>No</Alquilada>
                             </Parcela>
                             <Parcela trafo='1' Sector='K'>
                              <ID>2</ID>
                              <Nombre>Par 2 Sec. K</Nombre>
                              <Numero>122531717</Numero>
                              <Alquilada>No</Alquilada>
                             </Parcela>
                            </Parcelas>";

            XElement xmldoc1 = XElement.Parse(xml1);
            XElement xmldoc2 = XElement.Parse(xml2);
            

            List<Producto> query = (from item1 in xmldoc1.Elements("Nodo")
                                    join item2 in xmldoc2.Elements("Parcela") 
                                    on item1.Attribute("s").Value equals item2.Element("Numero").Value
                                    select new Producto()
                                    {
                                        NumeroSerie = item1.Attribute("s").Value,
                                        Nombre = item2.Element("Nombre").Value,
                                        Alquilado = item2.Element("Alquilada").Value,
                                        Modelo = item1.Element("Model").Attribute("m").Value
                                    }).ToList<Producto>();

            return query;
            
        }

Si se observa en la consulta como se ha definido el join, se vera que se une el valor de un atributo del primer xml, con el valor de un nodo del segundo, al usarse:

on item1.Attribute("s").Value equals item2.Element("Numero").Value

 

Aclaraciones

En el ejemplo se hace uso del método XElement.Parse() para cargar desde variables del tipo string el xml

En caso de ser desde un archivo debería usarse: XElement.Load()

 

[C#]
 

7 comentarios:

  1. Hola:

    Alguien me puede orientar en como asignar un Id a un TAG de un XML, el cual creo en modo diseño y muestro posteriormente.

    Se como crear el archivo, pero me falla en la asignacion de los Id´s. El formato debe de quedar mas o menos asi:






    11/01/2013

    Pero lo unico que he logrado hacer es esto:




    /



    El código que utilizo es el siguiente:

    private void button1_Click(object sender, EventArgs e)
    {
    XmlTextWriter raiz = new XmlTextWriter(txtNumero.Text+".xml", new System.Text.ASCIIEncoding());
    raiz.Formatting = Formatting.Indented;

    raiz.WriteStartElement("Uno");

    raiz.WriteStartElement("Identificacion);
    raiz.WriteElementString("Numero, txtNumeroAvaluo.Text);
    raiz.WriteElementString("Fecha, txtFechaAvaluo.Text);
    raiz.WriteElementString("Clave, txtClaveValuador.Text);

    raiz.WriteEndElement();
    raiz.Close();



    Alguna idea de como asignarlo?


    Gracias por la ayuda..

    ResponderEliminar
  2. Sorry, se fue sin la informacion, aqui dejo como debe de quedar, he eliminado los encapsuladores a proposito para conseguir que se vea el codigo en XML, las -- significa el contenido que debe de llevar.

    Gracias por la ayuda.


    Uno
    Identificacion id= "a" -- Identificacion
    Numero id= "a.1" -- /Numero
    Fecha id= "a.2" -- /Fecha
    Clave id= "a.3" --/Clave
    /Identificacion

    Y lo que he conseguido es:



    Uno
    Identificacion
    Numero -- Numero
    Fecha -- /Fecha
    Clave --/Clave
    /Identificacion

    ResponderEliminar
  3. hola Alfred

    los id son atributos

    Writing Attributes

    usarias el metodo WriteAttributeString()

    saludos

    ResponderEliminar
  4. Hola Leandro buenas noches, favor de apoyarme con el siguiente tema!!

    Teniendo un xml de la siguiente manera:


    10285
    1
    Chai


    10294
    1
    Chai
    

    es muy simple pasarlo en Json:
    {
    "OrderDetails": [
    {
    "OrderID": "10285",
    "ProductID": "1",
    "ProductName": "Chai"
    },
    {
    "OrderID": "10294",
    "ProductID": "1",
    "ProductName": "Chai"
    }
    ]
    }

    Y a partir de ahi facilmente lo puedo mostrar en una grila; pero el tema viene cuando el xml devuelto tiene anidaciones:

    10285

    1
    Chai

    1
    Beverages




    10294

    1
    Chai

    1
    Beverages


    

    Como veras despues de order details hay otro elemento products y luego mas adentro hay otro de nombre categories, por lo cual devuelve el siguiente json:
    {
    "OrderDetails": [
    {
    "OrderID": "10285",
    "Products": {
    "ProductID": "1",
    "ProductName": "Chai",
    "Categories": {
    "CategoryID": "1",
    "CategoryName": "Beverages"
    }
    }
    },
    {
    "OrderID": "10294",
    "Products": {
    "ProductID": "1",
    "ProductName": "Chai",
    "Categories": {
    "CategoryID": "1",
    "CategoryName": "Beverages"
    }
    }
    }
    ]
    }

    Ahi esta el tema, como hago para mostrarlo en una grilla desde ese jsonporque existen elementos internos, o mejor dicho como recorro ese json para ir llenando una tabla o grilla por ejemplo; pero todo en jquery, agradecere mucho si me apoyas en este tema, no es ningun trabajo que tenga, solo tengo curiosidad!!

    (PD Que grilla me recomiendas usar con jquery)

    Saludos!!

    ResponderEliminar
  5. Leandro por lo visto no puedo publicar codigo xml !!! o como la hago!


    10285
    1
    Chai


    10294
    1
    Chai
    





    10285

    1
    Chai

    1
    Beverages




    10294

    1
    Chai

    1
    Beverages


    

    ResponderEliminar
  6. hola Franky

    para publicar xml tener que aplicar encode al texto

    html encode

    porque no usas el grid de

    jgGrid

    con esta podrias mostrar json directamente

    saludos

    ResponderEliminar
  7. Ok lo estoy revisando pero en que formato json espera el del jqgrid,es porque yo lo estoy transformando desde xml a json y no se si tambien tengo que incluir el elemento raiz o no y si acepta elementos anidados o no??
    Gracias!!

    ResponderEliminar