IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème avec XpathNavigator et le parsage XML


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut Problème avec XpathNavigator et le parsage XML
    Bonjour à tous,

    via une httprequest, je recupère la chaine de caractère suivante qui est en réalité un flux XML, voici un extrait:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <feed>
    <page>1</page>
    <count>5</count>
    <results type="movie">8</results>
    <results type="theater">0</results>
    <results type="tvseries">1</results>
    <results type="person">0</results>
    <results type="news">61</results>
    <totalResults>70</totalResults>
    <movie code="61282">
           <originalTitle>Avatar</originalTitle>
            <title>Avatar</title>  
            <productionYear>2009</productionYear>
            <release>
                <releaseDate>2010-09-01</releaseDate>
            </release><castingShort>
    </movie>
    <movie code="143950"> ... </movie>
    <movie code="46284"></movie>
    <movie code="187247"></movie>
    <feed/>

    je souhaite donc parser ce document XML afin de proposer une liste d'objet Film. Cependant lorsque que je souhaite naviguer dans mon XML grâce à XpathNavigator je n'obtient pas de résultat, voici les test que j'ai réalisé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     XmlDocument test = new XmlDocument();
     test.LoadXml(xml); //La variable xml contient la chaîne du dessus
     
     XPathNavigator nav= test.CreateNavigator();
     
     XPathNodeIterator iterator = nav.SelectChildren("//feed",""); //Cette ligne retourne une collection vide
     XPathNodeIterator iterator2 = nav.SelectDescendants("//feed", "", false); //Cette ligne retourne une collection vide
     XPathNodeIterator iterator3 = nav.Select("//feed");//Cette ligne retourne une collection vide
                XPathNodeIterator iterator4 = nav.SelectChildren(XPathNodeType .Element); //Cette ligne retourne fonctionne et me ramène juste l'élément feed
    iterator4.MoveNext();//je me déplace sur l'élément feed
    nav= iterator4.Current;
    iterator4 = fff.SelectChildren(XPathNodeType.Element); //Cette ligne me ramene tout les noeud enfant
    iterator3 = fff.Select("/feed/movie"); //Cette ligne me ramene rien
    iterator = fff.SelectChildren("/feed/movie", "");  //Cette ligne me ramene rien

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Oula, tu te compliques la vie...

    avec Linq to XML:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        XDocument doc = XDocument.Parse(xml);
        var query =
            from m in doc.Root.Elements("movie")
            select new Movie
            {
                Code = (int)m.Attribute("code"),
                OriginalTitle = (string)m.Element("originalTitle"),
                Title = (string)m.Element("title"),
                ProductionYear = (int)m.Element("productionYear"),
                ReleaseDate = DateTime.ParseExact(m.Element("release").Element("releaseDate").Value, "yyyy-MM-dd", null)
            };
        List<Movie> movies = query.ToList();

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    hélas,

    t'as réponse me plait beaucoup si ce n'est que je l'ai déjà essayé et que le parsage ne marche pas non plus, cela me renvoi une collection vide ...

    je ne comprend pas

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bah moi j'ai testé et ça fonctionne bien... mais a priori tu n'as pas envoyé le vrai document XML (le XML que tu as posté n'est pas bien formé), peut-être que la vraie structure est différente.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    voici le XML complet :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://www.allocine.net/v6/ns/">
      <page>1</page>
      <count>5</count>
      <results type="movie">8</results>
      <results type="theater">0</results>
      <results type="tvseries">1</results>
     
      <results type="person">0</results>
      <results type="news">61</results>
      <totalResults>70</totalResults>
      <movie code="61282">
        <originalTitle>Avatar</originalTitle>
        <title>Avatar</title>
     
        <productionYear>2009</productionYear>
        <release>
          <releaseDate>2010-09-01</releaseDate>
        </release>
        <castingShort>
          <directors>James Cameron</directors>
          <actors>Sam Worthington, Zoe Saldana, Sigourney Weaver, Stephen Lang, Michelle Rodriguez</actors>
     
        </castingShort>
        <statistics>
          <pressRating>4.33333</pressRating>
          <userRating>4.15077</userRating>
        </statistics>
        <poster path="/medias/nmedia/18/78/95/70/19485155.jpg" href="http://images.allocine.fr/medias/nmedia/18/78/95/70/19485155.jpg" />
        <linkList>
          <link rel="aco:web" href="http://www.allocine.fr/film/fichefilm_gen_cfilm=61282.html" />
     
        </linkList>
      </movie>
      <movie code="143950">
        <originalTitle>Avatar</originalTitle>
        <productionYear>2004</productionYear>
        <castingShort>
          <directors>Jian Hong Kuo</directors>
     
          <actors>Genevieve O'Reilly, Luoyong Wang, Kay Siu Lim, David Warner, Joan Chen</actors>
        </castingShort>
        <statistics>
          <userRating>4.30833</userRating>
        </statistics>
        <linkList>
          <link rel="aco:web" href="http://www.allocine.fr/film/fichefilm_gen_cfilm=143950.html" />
        </linkList>
     
      </movie>
      <movie code="46284">
        <originalTitle>Avatars</originalTitle>
        <productionYear>2001</productionYear>
        <castingShort>
          <directors>Ben Elia</directors>
          <actors>Ken Samuels, Alex Ligen, Cédric Brenner, Gaï Assouline, Thomas Guerigen</actors>
     
        </castingShort>
        <statistics>
          <userRating>4.5</userRating>
        </statistics>
        <linkList>
          <link rel="aco:web" href="http://www.allocine.fr/film/fichefilm_gen_cfilm=46284.html" />
        </linkList>
      </movie>
     
      <movie code="187247">
        <originalTitle>Avatar 3</originalTitle>
        <productionYear>2015</productionYear>
        <castingShort>
          <directors>James Cameron</directors>
        </castingShort>
        <linkList>
     
          <link rel="aco:web" href="http://www.allocine.fr/film/fichefilm_gen_cfilm=187247.html" />
        </linkList>
      </movie>
      <movie code="178014">
        <originalTitle>Avatar 2</originalTitle>
        <productionYear>2014</productionYear>
        <castingShort>
          <directors>James Cameron</directors>
     
          <actors>Sam Worthington, Zoe Saldana</actors>
        </castingShort>
        <linkList>
          <link rel="aco:web" href="http://www.allocine.fr/film/fichefilm_gen_cfilm=178014.html" />
        </linkList>
      </movie>
      <tvseries code="4545">
        <originalTitle>Avatar: The Last Airbender</originalTitle>
     
        <title>Avatar, le Dernier Maître de l'Air</title>
        <castingShort>
          <actors>Marc Cassot, Gwénael Sommier, Alexis Thomassian, Tony Marot, Laura Préjean</actors>
        </castingShort>
        <yearStart>2005</yearStart>
        <statistics>
          <userRating>3.68446</userRating>
     
        </statistics>
        <poster path="/medias/nmedia/18/69/15/09/18864429.jpg" href="http://images.allocine.fr/medias/nmedia/18/69/15/09/18864429.jpg" />
        <linkList>
          <link rel="aco:web" href="http://www.allocine.fr/series/ficheserie_gen_cserie=4545.html" />
        </linkList>
      </tvseries>
      <news code="18606351">
        <title>Box-office mondial : "Harry Potter 7.2" talonne "Titanic"</title>
     
        <headline>En générant 1,13 milliards de dollars à travers le monde, "Harry Potter et les reliques de la mort - partie 2" devient le troisième plus gros succès commercial de tous les temps. Le film se classe derrière "Avatar" et "Titanic".</headline>
        <publication dateStart="2011-08-10" />
        <picture path="/medias/nmedia/18/85/54/15/19794437.jpg" href="http://images.allocine.fr/medias/nmedia/18/85/54/15/19794437.jpg" />
        <categoryList>
          <category code="23006">Business</category>
        </categoryList>
      </news>
      <news code="18605227">
     
        <title>James Cameron nommé «Explorateur» !</title>
        <headline>Le réalisateur James Cameron a reçu ce jeudi 23 juin 2011 le titre d’explorateur du magazine National Geographic.</headline>
        <publication dateStart="2011-06-24" />
        <picture path="/medias/nmedia/18/84/95/60/19766270.jpg" href="http://images.allocine.fr/medias/nmedia/18/84/95/60/19766270.jpg" />
        <categoryList>
          <category code="23004">Célébrités</category>
        </categoryList>
     
      </news>
      <news code="18604395">
        <title>"Avatar" : la parodie... en 3D !</title>
        <headline>Le duo derrière les parodies "Scary Movie", "Sexy Movie", "Spartatouille" ou encore "Mords-moi sans hésitation" annonce le lancement d'une parodie d'"Avatar"... en 3D. Le titre : "The Biggest Movie of All Time 3D".</headline>
        <publication dateStart="2011-05-23" />
        <picture path="/medias/nmedia/18/84/52/56/19745350.jpg" href="http://images.allocine.fr/medias/nmedia/18/84/52/56/19745350.jpg" />
        <categoryList>
          <category code="23001">Tournages</category>
     
        </categoryList>
      </news>
      <news code="18604246">
        <title>2010 : fréquentation record en salles</title>
        <headline>La fréquentation des salles de cinéma en France enregistre un record historique jamais atteint depuis 1967, avec un peu plus de 206 millions d'entrées totalisées sur l'année 2010.</headline>
        <publication dateStart="2011-05-17" />
        <picture path="/medias/nmedia/18/84/42/77/19739726.jpg" href="http://images.allocine.fr/medias/nmedia/18/84/42/77/19739726.jpg" />
        <categoryList>
     
          <category code="23006">Business</category>
        </categoryList>
      </news>
      <news code="18602797">
        <title>"Avatar 2" : James Cameron en mode repérage !</title>
        <headline>Si ses plans de repérage sous-marins ont été perturbés par le récent séisme au Japon, James Cameron continue de préparer activement "Avatar 2", dans la forêt amazonienne. Et c'est le moment qu'a choisi Arnold Schwarzenegger pour lancer entendre qu'il serait de l'aventure.</headline>
        <publication dateStart="2011-03-27" />
     
        <picture path="/medias/nmedia/18/83/68/08/19702457.jpg" href="http://images.allocine.fr/medias/nmedia/18/83/68/08/19702457.jpg" />
        <categoryList>
          <category code="23001">Tournages</category>
        </categoryList>
      </news>
    </feed>

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ah ok, c'est à cause du namespace XML
    Là ça devrait être bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        XDocument doc = XDocument.Parse(xml);
        XNamespace ns = "http://www.allocine.net/v6/ns/";
        var query =
            from m in doc.Root.Elements(ns + "movie")
            let releaseDate = m.Elements(ns + "release").Elements(ns + "releaseDate").FirstOrDefault()
            select new Movie
            {
                Code = (int)m.Attribute("code"),
                OriginalTitle = (string)m.Element(ns + "originalTitle"),
                Title = (string)m.Element(ns + "title"),
                ProductionYear = (int)m.Element(ns + "productionYear"),
                ReleaseDate = releaseDate != null
                                ? DateTime.ParseExact(releaseDate.Value, "yyyy-MM-dd", null)
                                : default(DateTime)
            };
            List<Movie> movies = query.ToList();
    (j'ai aussi ajouté la gestion du cas où il n'y a pas la release date, il faudra peut-être faire pareil pour d'autres éléments si besoin)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup, ça fonctionne, je passe le sujet en résolu.

    sinon juste pour info, que veut dire cette ligne de code dans la requête linq ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let releaseDate = m.Elements(ns + "release").Elements(ns + "releaseDate").FirstOrDefault()

    merci encore

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par vikking Voir le message
    sinon juste pour info, que veut dire cette ligne de code dans la requête linq ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let releaseDate = m.Elements(ns + "release").Elements(ns + "releaseDate").FirstOrDefault()
    let introduit une variable intermédiaire dans la requête. En gros, on a besoin de vérifier que la valeur de cette expression n'est pas null, et aussi d'utiliser cette valeur. Plutôt que de répéter deux fois l'expression (ce qui nuirait à la lisibilité, et diminuerait les performances en exécutant 2 fois la même chose), on introduit une variable pour réutiliser la valeur ensuite.

    Ensuite, m.Elements("release").Elements("releaseDate") récupère tous les éléments <releaseDate> qui sont dans des éléments <release>. FirstOrDefault renvoie le premier élément correspondant s'il existe, et renvoie null si aucun élément correspondant n'existe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JDOM] Problème avec le parsing du fichier XML
    Par nounouuuuu201186 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 10/02/2012, 14h08
  2. Problème avec cooliris et fichier crossdomain.xml
    Par TonySib dans le forum Débuter
    Réponses: 0
    Dernier message: 20/05/2009, 15h30
  3. problème avec "formatString" dans les balises xml
    Par k750_b dans le forum Alimentation
    Réponses: 0
    Dernier message: 17/06/2008, 11h04
  4. problème avec le fichier postgres-ds.xml
    Par bard123 dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 29/02/2008, 10h46
  5. [SimpleXML] Problème avec les accents dans le XML
    Par trotters213 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/12/2006, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo