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#]
|
Hola:
ResponderEliminarAlguien 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.
ResponderEliminarGracias 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
ResponderEliminarlos id son atributos
Writing Attributes
usarias el metodo WriteAttributeString()
saludos
Hola Leandro buenas noches, favor de apoyarme con el siguiente tema!!
ResponderEliminarTeniendo 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!!
Leandro por lo visto no puedo publicar codigo xml !!! o como la hago!
ResponderEliminar10285
1
Chai
10294
1
Chai
10285
1
Chai
1
Beverages
10294
1
Chai
1
Beverages
hola Franky
ResponderEliminarpara publicar xml tener que aplicar encode al texto
html encode
porque no usas el grid de
jgGrid
con esta podrias mostrar json directamente
saludos
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??
ResponderEliminarGracias!!