Xml Parsing sur WP7 [Résolu]

Messages postés
6
Date d'inscription
jeudi 23 juin 2011
Statut
Membre
Dernière intervention
31 janvier 2012
- - Dernière réponse : MariamKh
Messages postés
6
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; }
                }
            }
    }
}
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
6
Date d'inscription
jeudi 23 juin 2011
Statut
Membre
Dernière intervention
31 janvier 2012
3
Merci
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(); 
                }
            }      

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de MariamKh
Messages postés
14534
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 juin 2019
88
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
22
0
Merci
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é. -
Commenter la réponse de krimog
Messages postés
6
Date d'inscription
jeudi 23 juin 2011
Statut
Membre
Dernière intervention
31 janvier 2012
0
Merci
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?
Commenter la réponse de MariamKh
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
30
0
Merci
 
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
Commenter la réponse de sebmafate