[ Foro de C# ]

Leer archivo XML con LinQ

30-May-2014 00:03
Invitado (AndresZapata)
6 Respuestas

Buenas

Tengo una duda respecto a C# + XML + LinQ, he estado navegando por internet mirando haber como me puedo defender, pero la verdad que no he podido, asi que por ahora la opcion es algo de ayuda en los foros.

Este es el dilema.
Tengo un archivo XML, con LinQ puedo leer todo el archivo y hasta ahi todo normal, pero lo que quiero es meter los datos dentro de una matriz, siendo de la posicion [0,0] hasta la posicion [0,5] los datos correspondientes desde el <ammo> </ammo>. ya en posicion [1,0] hasta [1,5] el segundo bloque del XML.

Archivo XML.

 
<AMMO>
  <ammo>
    <ammoID>01</ammoID>
    <name>9mm</name>
    <type>Exploration</type>
    <image></image>
    <attribute unit="int">
      <type>Attack</type>
      <value>1</value>
      <slot>1</slot>
    </attribute>
    <drop_ratio unit="%">
      <value>60</value>
    </drop_ratio>
  </ammo>
 
  <ammo>
    <ammoID>02</ammoID>
    <name>9x21mm</name>
    <type>Exploration</type>
    <image></image>
    <attribute unit="int">
      <type>Attack</type>
      <value>3</value>
      <slot>1</slot>
    </attribute>
    <drop_ratio unit="%">
      <value>15</value>
    </drop_ratio>
  </ammo>
 



Seria al final tener algo asi:

[table]
[tr]
[td]1[/td][td]9mm[/td][td]Exploration[/td][td]1[/td][td]1[/td][td]60[/td]
[/tr]
[tr]
[td]2[/td][td]9x21mm[/td][td]Exploration[/td][td]3[/td][td]1[/td][td]15[/td][/tr][/table]

Bueno, espero que me ayuden a resolver esa duda que tengo.
Gracias de antemano


30-May-2014 19:24
Nacho Cabanes (+30)

Pon tu fuente, para que podamos ver cómo estás leyendo el XML.

¿Quieres una matriz bidimensional de strings a partir de esos datos?


30-May-2014 23:09
Andres Zapata

Hola, Gracias por responder.

EL codigo es el siguiente, he estado probando una cosa detras de otra, y en la documentacion esto es lo que mas me ha ayudado: http://msdn.microsoft.com/es-es/library/bb387049.aspx
Pero al hacerlo, me carga todos los valores de los elementos XML cuando necesito uno por uno e ir metiendolo a la matriz.

 
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
 
            XElement ammoXDoc = XElement.Load("D:\\RPGzProject\\ammo.xml");
            //IEnumerable<XElement> childList = from el in ammoXDoc.Elements() select el;
 
 
            Console.WriteLine(ammoXDoc.Value);
            Console.ReadKey();
        }
    }
}
 


Sobre la pregunta que me haces, supongo que la mejor opcion ... en si la idea es, al tener todos los datos del XML en una matriz, despues pueda acceder a ellos facilmente mas adelante.

Gracias por la ayuda


31-May-2014 10:59
Nacho Cabanes (+30)

Es que tu fuente no "itera" a través de los nodos del XML, sólo los carga. Además, tiene un par de errores que hacen que no sea un XML válido: abres una etiqueta <ammo>, que a su vez contiene otra con el mismo nombre, y además esta primera etiqueta no está cerrada.

En cuanto a dónde almacenar: Si los guardas en un array convencional, perderás la información sobre la "clave" de cada valor. Sería mejor un "diccionario", como una tabla Hash o una SortedList.

Voy a ver si consigo sacar un rato para prepararte un ejemplo completo, pero dudo que pueda mirarlo antes de esta tarde, ahora tengo varias cosas urgentes...


01-Jun-2014 00:19
Andres Zapata

El XML esta bien cerrado, solo que puse parte de el, solo que los otros son nodos root/child son iguales, solo cambian valores :P

En cuanto a lo que comentas de <ammo> pense que si se diferenciaba si una se escribia en mayuscula y otra en minuscula.


02-Jun-2014 01:14
Nacho Cabanes (+30)

Lo de confiar en que las mayúsculas sean suficiente es un poco arriesgado.

Yo he modificado tu fichero XML para que sea así:

 
<ammodata>
  <ammo>
    <ammoID>01</ammoID>
...
    </drop_ratio>
  </ammo>
</ammodata>
 



Y en ese caso, podrías recorrer todos los nodos del fichero XML (sin necesidad de LINQ, si no quieres aplicarles condiciones) con algo como

 
// Ejemplo de recorrido de XML
// Nacho, Junio 2014
 
using System;
using System.Xml;
 
class RecorrerXML
{
    static void Main(string[] args)
    {
        XmlDocument documento = new XmlDocument();
        documento.Load("f:\\ammo.xml");
        XmlElement root = documento.DocumentElement;
 
        XmlNodeList nodosAmmo = root.SelectNodes("ammo");
        foreach (XmlNode nodoActual in nodosAmmo)
        {
            XmlNodeList subnodos = nodoActual.ChildNodes;
            foreach (XmlNode subnodo in subnodos)
            {
                System.Console.Write(subnodo.Name + ": ");
                Console.WriteLine(subnodo.InnerText);
            }
            Console.WriteLine();
        }
    }
}
 


Que te daría como resultado:

 
ammoID: 01
name: 9mm
type: Exploration
image:
attribute: Attack11
drop_ratio: 60
 
ammoID: 02
name: 9x21mm
type: Exploration
image:
attribute: Attack31
drop_ratio: 15
 



Guardar esos datos en un array (o, para mi gusto, mejor en una tabla Hash) ya debería ser fácil.


02-Jun-2014 02:29
Andres Zapata

Vale, muchisimas gracias

Tendre en cuenta las mayusculas y minusculas en los demas XML.

Probare la ayuda en el codigo haber que tal me va

Muchisimas gracias






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)