Xml Parsing sur WP7

Résolu
MariamKh Messages postés 5 Date d'inscription jeudi 23 juin 2011 Statut Membre Dernière intervention 31 janvier 2012 - 13 juil. 2011 à 11:10
MariamKh Messages postés 5 Date d'inscription jeudi 23 juin 2011 Statut Membre Dernière intervention 31 janvier 2012 - 19 juil. 2011 à 13:33
Bonjour,
j'ai crée un code en c# (sur Windows Phone 7) qui affichera des données extraites d'un fichier xml, mais il ne fonctionne pas ou il m'affiche "NullReferenceException".
Voici le fichier xml:
<?xml version="1.0" encoding="utf-8" ?>
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
<forecast_conditions>
<day_of_week data="lun."/>
<low data="28"/>
<high data="38"/>

<condition data="Partiellement ensoleillé"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="mar."/>
<low data="27"/>
<high data="39"/>

<condition data="Temps clair"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="mer."/>
<low data="25"/>
<high data="38"/>

<condition data="Ensoleillé dans l'ensemble"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="jeu."/>
<low data="24"/>
<high data="33"/>

<condition data="Ensoleillé dans l'ensemble"/>
</forecast_conditions>
</weather>



et voici mon code:
namespace WEATHER2
    {
    public partial class MainPage : PhoneApplicationPage
        {
        // Constructeur
        public MainPage()
            {
            InitializeComponent();
            }

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
            {
             XDocument doc = XDocument.Load("Gweather.xml");
                        var x from c in doc.Root.Element("weather").Elements() where c.Name "forecast_conditions" select c;

                        foreach (XElement element in x)
                            {
                            Weather_Element welement = new Weather_Element(); 
                            welement.Day = element.Element("day_of_week").Attribute("data").Value;
                            welement.Low = element.Element("low").Attribute("data").Value;
                            welement.High = element.Element("high").Attribute("data").Value;
                            welement.Condition = element.Element("condition").Attribute("data").Value;
                            }
                          listBox1.ItemsSource = x;

            } 
        public class Weather_Element
            {
            string day;
            string low;
            string high;
            string condition;

            public string Day
                {
                get { return day; }
                set { day = value; }
                }

            public string Low
                {
                get { return low; }
                set { low = value; }
                }
            public string High
                {
                get { return high; }
                set { high = value; }
                }
            public string Condition
                {
                get { return condition; }
                set { condition = value; }
                }
            }
    }
}

5 réponses

MariamKh Messages postés 5 Date d'inscription jeudi 23 juin 2011 Statut Membre Dernière intervention 31 janvier 2012
19 juil. 2011 à 13:33
Salut tout le monde!
En fait, avec un peu de recherche j'ai trouvé une solution qui s'adapte parfaitement aux besoins de mon application:
 void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                StringReader stream = new StringReader(e.Result);
                XmlReader reader = XmlReader.Create(stream);

                string Day = String.Empty;
                string Low = String.Empty;
                string High = String.Empty;
                string Condition = String.Empty;

                reader.MoveToContent();

                while (reader.Read())
                {
                    switch (reader.Name)
                    {
                        case ("day_of_week"):
                            {
                                listBox1.Items.Add(new ListBoxItem()
                                  {
                                      Content = reader.GetAttribute("data")
                                  });
                                Day = Content.ToString();
                            } break;
                        case ("low"):
                            {
                                listBox1.Items.Add(new ListBoxItem()
                                {
                                    Content = reader.GetAttribute("data")
                                });
                                Low = Content.ToString();
                            } break;
                        case ("high"):
                            {
                                listBox1.Items.Add(new ListBoxItem()
                                {
                                    Content = reader.GetAttribute("data")
                                });
                                High = Content.ToString();
                            } break;
                        case ("condition"):
                            {
                                listBox1.Items.Add(new ListBoxItem()
                                {
                                    Content = reader.GetAttribute("data")
                                });
                                Condition = Content.ToString();
                            } break;
                    }
                }
            reader.Close(); 
                }
            }      
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
13 juil. 2011 à 11:39
C'est bizarre...ça me fait grandement penser à ce post
Pas de doublon, please.
As-tu pris en compte mes remarques?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
13 juil. 2011 à 11:54
Salut

Déjà, tu peux simplifier ton code ainsi :
XDocument doc =  XDocument.Load("Gweather.xml");
foreach (XElement element in doc.Descendants("forecast_conditions"))
{
//...
}


Concernant le problème lui-même, as-tu essayer de dérouler ton code pas-à-pas ? Rentre-t-il bien dans le foreach ?

Tu crées un objet de type Weather_Element à chaque itération de ton foreach. Tu le remplis, mais ensuite, tu n'en fais plus rien et tu ne gardes aucune référence vers cet objet...
Le principe de ton programme ne serait-il pas plutôt de créer une List<Weather_Element> dans laquelle tu insères tous les objets que tu crées dans le foreach, et que tu passes en ItemsSource de ta listBox1 ?

D'ailleurs, si c'est le cas , tu peux encore simplifier le truc :
Tu crées un constructeur dans ta classe Weather_Element qui se base sur un XElement (et qui en gros est identique à ton foreach).
Ensuite, tu fais juste
listBox1.ItemsSource = from c in doc.Descendants("forecast_conditions") select new Weather_Element(c);

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
MariamKh Messages postés 5 Date d'inscription jeudi 23 juin 2011 Statut Membre Dernière intervention 31 janvier 2012
13 juil. 2011 à 12:00
En fait l'erreur s'affiche à ce niveau:[code=cs] var x = from c in doc.Root.Element("weather").Elements() where c.Name == "forecast_conditions" select c;[code=cs]
et puis comment savoir si x est bien remplie?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 juil. 2011 à 12:05
 
var x from c in doc.Root.Element("weather").Elements() where c.Name "forecast_conditions" select c;


on vérifie comme ceci :
if (x.Any()) {
   // x n'est pas vide !
}


A première vue tu n'as pas ouverte la documentation de Linq !


Sébastien FERRAND
Ingénieur Concepteur Senior
Microsoft Visual C# MVP 2004 - 2009
Blog Photo
0
Rejoignez-nous