locked
Parsing Xml Document RRS feed

  • Question

  • Salut,

    j'utilise un httpRequest et je veux parser le xml retourné voila le code que j'utlise:

     

    private void button1_Click(object sender, RoutedEventArgs e)

            {

                WebClient wc = new WebClient();

     

                wc.DownloadStringAsync(new Uri("http://www.bing.com"));

                wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);

     

            }

     

            void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)

            {

                if (e.Error==null)

                {     XDocument xdc = XDocument.Parse(e.Result, LoadOptions.None);

                    textBlock1.Text = xdc.FirstNode.ToString();

                    }

                }

    mais il me retourne une exception "NotSupportedException" sur cette ligne: XDocument xdc = XDocument.Parse(e.Result, LoadOptions.None);

    Merci!

     


    zied
    vendredi 22 juillet 2011 09:56

Réponses

  • La réponse que je t'avais apporté il y a un moment était bonne !!!! Est-ce qu'il y a moyen de la remettre en bonne réponse ? Je détaille sinon ci-dessous.

    Les 2 liens que l'on a donné pointent vers la même source, c'est la même librairie.

    Ensuite, ton json peut avoir ce format par exemple :

    
    
    {
     "items": [
      {
       "date": "25/07 18:40", 
       "id": "1234", 
       "img": "http://monsite/10062_5651a65e235dea7bc3d90b1ae2e21b4d.jpg",  
       "title": "Titre 1"
      }, 
      {
       "date": "25/07 18:20", 
       "id": "5678", 
       "img": "http://monsite/5140f30fc8ae81662614b101a7406c1d.png", 
       "title": "Titre 2"
      }
     ]
    }



    Dans ton code, tu auras sûrement des objets représentant les données que tu télécharges :

    public class News
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Date { get; set; }
        public string Img { get; set; }
    }
    


    Voici comment tu t'y prends avec la librairie que Rudy et moi t'avons proposé (dans ton évènement DownloadStringCompleted).

    client.DownloadStringCompleted += (s, e) => 
    {
        if (e.Error != null)
           return;
    
        JObject token = JObject.Parse(e.Result);
        var itemsString = token["items"].ToString();
    
        List<News> news = JsonConvert.DeserializeObject<List<News>>(itemsString);
     };
    


    S'il n'y a pas eu d'erreurs, ton e.Result te retourne le flux, c'est à partir de lui que tu dois travailler.

    Ensuite, je cible un élément spécifique de mon flux (l'élément items). Et après, je le désérialise dans une liste de News, car, c'est une liste de news :-).

    Bon courage!

     

     

     


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat
    • Proposé comme réponse David_Poulin mardi 26 juillet 2011 07:01
    • Marqué comme réponse Zied Nassr mardi 26 juillet 2011 13:21
    mardi 26 juillet 2011 07:01

Toutes les réponses

  • Bonjour,

    Et en utilisant la surcharge XDocument.Parse(e.Result); ?


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat
    vendredi 22 juillet 2011 10:30
  • c la meme erreur!
    zied
    vendredi 22 juillet 2011 13:46
  • Ha oui, un détail m'avait échappé. L'url que tu as en paramètre ne te fournit pas un XML valide, donc, c'est normal que ça plante. :-)
    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat
    vendredi 22 juillet 2011 14:02
  • C'est une erreur assez commune de penser que le HTML est du XML, ce n'est pas du tout le cas, c'est du SGML (mais XML est du SGML aussi).

     

    En Xml, toute balise doit être fermé implicitement <br /> ou explicitement <br></br>, en html, tu peux écrire <div><br></div> sans aucun problème, ce qui n'est pas XML Compliant.

     

    C'est pour cela qu'il y a le xhtml, c'est du html mais façon XML (avec donc fermeture obligatoire et d'autres modif) 

     

    vendredi 22 juillet 2011 15:58
  • bon mon concept consiste  à envoyer une requete :

    WebClient wc = new WebClient();

    wc.DownloadStringAsync(new Uri("https://www.blabla.com/gw/action=states&mode=json/"));

       wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);

    ensuite je ve parser le resultat dans la methode :"wc_DownloadStringCompleted" ... 

    j'ai lu dans un froum que le parse de json est le meme que xml c'est  pour cela que j'ai montionné le XML au début donc mon problème reste dans le parsing de resultat !

    Merci.


    zied
    samedi 23 juillet 2011 16:11
  • Alors, il y a une petite erreur. Le Json et le Xml ne peuvent pas être parsés de la même façon. Les données sont représentées de façon différentes, ce n'est pas le même format, donc, il faudra s'y prendre différemment pour pouvoir parser du Xml ou du Json. 

    Concernant le Xml, tu peux utiliser les classes fournies par le Framework (XDocument & co) pour pouvoir parser ton xml.

    Pour le json, il y a d'excellentes librairies capables de faciliter le traitement de flux json comme Newtonsoft Json.NET ( http://james.newtonking.com/pages/json-net.aspx ). Il y a plein d'exemples qui te montreront comment parvenir aux résultats que tu attends.

    Bon courage!


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat
    samedi 23 juillet 2011 17:29
  • Bonjour,

    Est-ce que vous avez testé la solution proposée ? Merci de partager avec nous les résultats,afin que d'autres personnes avec le même problème puissent profiter de cette solution.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    samedi 23 juillet 2011 18:21
  • Pour ma part, je l'ai déjà bcp testé, et c'est opérationnel à 100%.

    Après, concernant son utilisation peut être plus ou moins complexe, c'est du cas par cas selon les besoins (^___^). ça dépend de si le flux doit être converti en un objet ou si l'on doit récupérer qu'une donnée de ce flux.

    Un exemple d'utilisation

    //On récupére le flux en Json et on créé un JObject avec.
    JObject token = JObject.Parse(e.Result);
    
    //Ensuite, selon la forme du flux, on pourra récupérer certains de ses éléments (membres).
    
    //Je récupère l'élément enfant de token qui s'appelle shortnewsfeed
    var monContenu = token["shortnewsfeed"].ToString();
    
    //Je déserialise ma chaine de caractère monContenu vers un object de type ShortNewsFeed
    var monObjet = JsonConvert.DeserializeObject<ShortNewsFeed>(monContenu);
    
    
    
    

    Après, je le redis, ça dépend vraiment des besoins.

    Le site regorge d'exemple, et l'aide est vraiment très bien faite : http://james.newtonking.com/projects/json/help/

    (^__^) 


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat
    • Modifié David_Poulin samedi 23 juillet 2011 18:45 texte modifié
    • Proposé comme réponse rudyhuynMVP samedi 23 juillet 2011 21:18
    • Marqué comme réponse Pascal Saille lundi 25 juillet 2011 17:48
    • Non marqué comme réponse Pascal Saille mardi 26 juillet 2011 04:41
    • Non proposé comme réponse Pascal Saille mardi 26 juillet 2011 17:50
    samedi 23 juillet 2011 18:39
  • Merci pour les liens mais est ce que vous pouvez nous simulé tout cela dans un petit exemple dans lequel on récupère les donnés du fichier Json  ensuite les parser dans une listeBox afin de les afficher..

    Merci!! :)


    zipo
    dimanche 24 juillet 2011 15:36
  • tu trouveras tout ce qu'il te faut dans les samples de la librairie JSON.net

     

    http://json.codeplex.com/SourceControl/changeset/view/61773

     

     


    WP addict
    dimanche 24 juillet 2011 16:41
  • dsl mais le lien que tu m'as envoyé est trés vague et il présente les librairie de linq to json ou de Json ... tout ce que je veux un petit exemple qui explique comment je peut parser un doc Json dans une listBox (par exemple!).

    Merci


    zipo
    lundi 25 juillet 2011 22:44
  • La réponse que je t'avais apporté il y a un moment était bonne !!!! Est-ce qu'il y a moyen de la remettre en bonne réponse ? Je détaille sinon ci-dessous.

    Les 2 liens que l'on a donné pointent vers la même source, c'est la même librairie.

    Ensuite, ton json peut avoir ce format par exemple :

    
    
    {
     "items": [
      {
       "date": "25/07 18:40", 
       "id": "1234", 
       "img": "http://monsite/10062_5651a65e235dea7bc3d90b1ae2e21b4d.jpg",  
       "title": "Titre 1"
      }, 
      {
       "date": "25/07 18:20", 
       "id": "5678", 
       "img": "http://monsite/5140f30fc8ae81662614b101a7406c1d.png", 
       "title": "Titre 2"
      }
     ]
    }



    Dans ton code, tu auras sûrement des objets représentant les données que tu télécharges :

    public class News
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Date { get; set; }
        public string Img { get; set; }
    }
    


    Voici comment tu t'y prends avec la librairie que Rudy et moi t'avons proposé (dans ton évènement DownloadStringCompleted).

    client.DownloadStringCompleted += (s, e) => 
    {
        if (e.Error != null)
           return;
    
        JObject token = JObject.Parse(e.Result);
        var itemsString = token["items"].ToString();
    
        List<News> news = JsonConvert.DeserializeObject<List<News>>(itemsString);
     };
    


    S'il n'y a pas eu d'erreurs, ton e.Result te retourne le flux, c'est à partir de lui que tu dois travailler.

    Ensuite, je cible un élément spécifique de mon flux (l'élément items). Et après, je le désérialise dans une liste de News, car, c'est une liste de news :-).

    Bon courage!

     

     

     


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat
    • Proposé comme réponse David_Poulin mardi 26 juillet 2011 07:01
    • Marqué comme réponse Zied Nassr mardi 26 juillet 2011 13:21
    mardi 26 juillet 2011 07:01