none
XML problema al recojer el valor RRS feed

  • Pregunta

  • Buenas,

     

    Estoy teniendo problema para recuperar los datos, a principio lo que quiero hacer es recuperar todos los valores del XML de forma individual de forma que puedo trabajar con ellos.

     

    Lo primero que hago es llamar la función y asignar el valor a un list para hacer la prueba

     public linea()
        {
          InitializeComponent();
    
    
          listBox.ItemsSource = Getlineas();
    }
    


    Para probar, lo que intento hacer es llamar todos los valores.

     public List<metro> Getlineas()
    {
    	XDocument xmlSource = XDocument.Load("metro.xml");
      var apps = from linea in xmlSource.Descendants("lineas")
            select new metro
              {
                nombre = linea.Element("nombre").Value,
                conexion = linea.Element("conexion").Value,
                latitude = linea.Element("latitude").Value,
                longitude = linea.Element("longitude").Value
    
              };
    
      
              
      
    		return apps.ToList();
    }
    

    public class metro
      {
    
        public string nombre { get; set; }
        public string conexion { get; set; }
        public string latitude { get; set; }
        public string longitude { get; set; }
    
      }
    

     

     

    En el emulador sale la cantidad de elementos pero el nombre pone el nombre del programa y del modelo como valor.

     

    METRO.metro

    METRO.metro

     

    EL XML lo tengo así

    <?xml version="1.0" encoding="utf-8" ?>
    <metro>
     <lineas>
       <nombre>Pinar de Chamartín</nombre>
       <conexion>1,4,ml1</conexion>
       <latitude></latitude>
       <longitude></longitude>
     </lineas>
     <lineas>
      <nombre>Bambú</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude></latitude>
      <longitude></longitude>
     </lineas>
    </metro>
    

     

    El ejemplo que tenes en el foro me retorna bien el valor del campo, pero si quiero todos los campos como seria?

     

    Esto me funciona pero necesito todos los valores.

    List<string> data = (from item in loadedData.Descendants("lineas")
                     select item.Element("nombre").Value).ToList();
    

     

    Muchas gracias

    sábado, 6 de agosto de 2011 14:19

Respuestas

  • Hola:

    La variable data como tu sabes es un list<metro>,  es decir para poder acceder a un elemento en concreto o accedes por el indice si lo conoces o bien en un foreach.

    1.

    data[0].nombre  te dará del primer elemento el nombre.

    2.

    foreach(metro m in data)

       // cada vez que iteras en m tendras un elemento de la lista y para acceder a el

       m.nombre;

     

    Si te refieres a obtenerdo a partir de un control al que le hayas hecho binding tienes que hacer un cast. Te pongo un ejemplo sencillo para obtener todos los elementos data de un ListBox.

     

    List<Metro> data =  ListBox.ItemSource as List<Metro>;

    if (data!=null)

    {

        //Aplicas cualquiera de las técnicas anteriores según tus necesidades

    }

     

    Aparte te paso un link a un hilo del foro donde se trato este tema del cast desde un elemento xml a un objeto.

     

    http://social.msdn.microsoft.com/Forums/es-ES/windowsphone7/thread/a1ad492e-d652-4e2c-948f-0089b0d7c0c2

     

    Saludos,

     


    phurtado
    • Marcado como respuesta ElbrinnerMVP sábado, 6 de agosto de 2011 19:18
    sábado, 6 de agosto de 2011 17:50

Todas las respuestas

  • Hola:

    Necesitas algo tal que así pero tienes que definir list<string> data, sino list<metro> data.

    List<metro> data = (from item in loadedData.Descendants("lineas")
                     select new metro{
                        nombre = item.Element("nombre").Value,
                        conexion = item.Element("conexion").Value,
                        latitude = item.Element("latitude").Value,
                        longitude =item.Element("longitude").Value
                     }).ToList();
    

    Saludos,


    phurtado
    sábado, 6 de agosto de 2011 15:05
  • Hola Pedro,

    A principio sigue saliendo el mismo resultado de antes.

     

    METRO.metro

    METRO.metro y los valores que tiene el campo son otros...

     

    He copiado con la única diferencia de la palabra que está en negrita porque no me reconocía la sintaxis.

     

    	XDocument xmlSource = XDocument.Load("metro.xml");
    
      List<metro> data = (from item in<strong> xmlSource.</strong>Descendants("lineas")
            select new metro{
              nombre = item.Element("nombre").Value,
              conexion = item.Element("conexion").Value,
              latitude = item.Element("latitude").Value,
              longitude = item.Element("longitude").Value
             }).ToList();
    
    
    
      return data;
    


    Una ves que me funcione esto tengo como hacer como recuperar solo nombre y etc desde data?

     

    gracias

    sábado, 6 de agosto de 2011 15:55
  • Hola:

    La variable data como tu sabes es un list<metro>,  es decir para poder acceder a un elemento en concreto o accedes por el indice si lo conoces o bien en un foreach.

    1.

    data[0].nombre  te dará del primer elemento el nombre.

    2.

    foreach(metro m in data)

       // cada vez que iteras en m tendras un elemento de la lista y para acceder a el

       m.nombre;

     

    Si te refieres a obtenerdo a partir de un control al que le hayas hecho binding tienes que hacer un cast. Te pongo un ejemplo sencillo para obtener todos los elementos data de un ListBox.

     

    List<Metro> data =  ListBox.ItemSource as List<Metro>;

    if (data!=null)

    {

        //Aplicas cualquiera de las técnicas anteriores según tus necesidades

    }

     

    Aparte te paso un link a un hilo del foro donde se trato este tema del cast desde un elemento xml a un objeto.

     

    http://social.msdn.microsoft.com/Forums/es-ES/windowsphone7/thread/a1ad492e-d652-4e2c-948f-0089b0d7c0c2

     

    Saludos,

     


    phurtado
    • Marcado como respuesta ElbrinnerMVP sábado, 6 de agosto de 2011 19:18
    sábado, 6 de agosto de 2011 17:50