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#]
|

3 comentarios:
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..
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
hola Alfred
los id son atributos
Writing Attributes
usarias el metodo WriteAttributeString()
saludos
Publicar un comentario en la entrada