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 de "requête" XPath


Sujet :

C#

  1. #1
    Membre habitué Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : février 2007
    Messages : 135
    Points : 127
    Points
    127
    Par défaut Problème de "requête" XPath
    Bonsoir à tous !

    J'ai un fichier XML formaté comme suit (Il est plus long que ça, je n'en mets qu'un fragment) :
    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
    <?xml version="1.0" encoding="utf-8" ?>
    <LevelsOfXP>
      <Level Value="1">
        <MinimumXP>0</MinimumXP>
      </Level>
      <Level Value="2">
        <MinimumXP>1000</MinimumXP>
      </Level>
      <Level Value="3">
        <MinimumXP>2250</MinimumXP>
      </Level>
      <Level Value="4">
        <MinimumXP>3750</MinimumXP>
      </Level>
      <Level Value="5">
        <MinimumXP>5500</MinimumXP>
      </Level>
    </LevelsOfXP>

    Ce fichier définit le palier d'expérience minimum (MinimumXP) pour atteindre le niveau voulu (Représenté par l'attribut "Value").

    Pour ne pas avoir à parcourir à chaque fois le fichier XML dans son entier, je souhaite commencer la lecture à partir de mon niveau de mon niveau.
    Je commence donc mon code comme suit :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    XmlDocument Doc = new XmlDocument();
    Doc.Load("monfichier.xml");
    XPathNavigator Navigator;
    XPathNodeIterator Nodes;
     
    byte CurrentLevel = CharacterLevel;
    uint CurentXP = CharacterTotalXP;                                                
     
    Nodes = Navigator.Select("//Level[@Value='" + CurrentLevel.ToString() + "']");
    MessageBox.Show(Nodes.Current.Value.ToString());

    Supposons que je sois "Level 1". La dernière ligne me permet de vérifier la valeur obtenue par ma requête et j'obtiens...
    01000225037505500
    Soit l'ensemble de mes valeurs de MinimumXP mise bout à bout. J'ai fait plusieurs tests avec des requêtes différentes (notamment sans le // avant Level) mais j'obtiens toujours le même résultat.

    Je n'arrive pas à savoir où je me suis trompé. Ne devrais-je pas récupérer simplement 1000 ?

    Cordialement,
    Tuttu

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : mai 2005
    Messages : 2 593
    Points : 7 620
    Points
    7 620
    Par défaut
    Le problème dans ton code c'est que tu n'es positionné sur aucun noeud. XPathNodeIterator comme son nom l'indique permet d'itérer sur des noeuds, il faut donc faire un MoveNext() avant toute chose. Sinon tu récupères tout et n'importe quoi puisque tu n'as pas positionné.

    Mais comme tu n'as besoin que d'un seul noeud le plus simple c'est d'utiliser la méthode SelectSingleNode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XPathDocument xpathDocument = new XPathDocument(...);
    XPathNavigator navigator = xpathDocument.CreateNavigator();
     
    XPathNavigator node = navigator.SelectSingleNode("//Level[@Value='1']");
    string val = node.Value;
    Dans l'exemple je passe par un XPathDocument. Plus approprié en général si tu utilises le fichier en lecture seule (moins gourmand que le XmlDocument).

    Si tu veux récupérer plusieurs noeuds
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XPathNodeIterator nodes = navigator.Select("//Level[@Value>'1']");
    foreach (XPathNavigator node in nodes)
    {
        string s = node.Value;
    }
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XPathNodeIterator nodes = navigator.Select("//Level[@Value>'1']");
    while (nodes.MoveNext())
    {
        string s = nodes.Current.Value;
    }
    Le fameux MoveNext fait alors son apparition. Mais en général on passe plutôt par le foreach je pense ^^
    Pas de questions techniques par MP

  3. #3
    Membre habitué Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : février 2007
    Messages : 135
    Points : 127
    Points
    127
    Par défaut
    En effet, j'avais oublié le Nodes.MoveNext(); que j'avais ajouté après ce post. J'étais en train de continuer mes tests infructueux. :p

    Grosso modo, quelle est la vitesse d'exécution du foreach ? Ca vaut le coup de gagner un peu de temps en le commençant au niveau actuel ou bien il est plus simple pour moi de partir à chaque fois du premier niveau tout en sachant qu'il n'y a guère plus de 50 niveau.

    En tout cas, merci pour le coup de main, je vais tenter d'adapter ça à ma sauce.

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : mai 2005
    Messages : 2 593
    Points : 7 620
    Points
    7 620
    Par défaut
    Le mieux est l'ennemi du bien comme on dit. Optimiser c'est une chose, mais il ne faut le faire que si c'est nécessaire. En gros, si le temps de l'opération est correct en codant ça normalement, pas besoin d'optimiser.

    Et sinon, le foreach ne fait que simplifier le parcours d'une collection possédant un itérateur. Donc niveau performance tu ne devrais pas voir de différence.
    Pas de questions techniques par MP

  5. #5
    Membre habitué Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : février 2007
    Messages : 135
    Points : 127
    Points
    127
    Par défaut
    Merci pour toutes les infos. Je passe en résolu et je continue mon schmilblick de mon côté. L'essentiel fonctionne, il ne me reste que les vérifications dont j'ai besoin à faire.

    Merci encore.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    mai 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2003
    Messages : 17
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Le problème dans ton code c'est que tu n'es positionné sur aucun noeud. XPathNodeIterator comme son nom l'indique permet d'itérer sur des noeuds, il faut donc faire un MoveNext() avant toute chose. Sinon tu récupères tout et n'importe quoi puisque tu n'as pas positionné
    2 ans après cette remarque pertinente me sauve quelques cheveux, merci !

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

Discussions similaires

  1. [Wamp] Problème d'insertion avec quote d'un formulaire
    Par cyberdevelopment dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 20/08/2006, 18h55
  2. [SQL-Server] Problèmes de guillemets et quotes dans un INSERT
    Par gregb34 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2006, 09h40

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