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 :

Récupérer valeur dans XML


Sujet :

C#

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut Récupérer valeur dans XML
    Bonjour, d'abord je débute en XML et C#... d'où ce post

    Suivant cet XML :
    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
    17
    18
    19
     
    <PROPOSALS version="13">
      <PROPOSAL Number="200704010" Caption="le nom">
        <ShowCaption>1</ShowCaption>
        <Indice>0</Indice>
        <ProposalType>0</ProposalType>
        <DateCreate>12/04/2007 10:58:53</DateCreate>
        <DateLastModif>31/07/2009 13:41:55</DateLastModif>
        <WriteBy>Adeline</WriteBy>
        <CaptionUser1>Chargee affaires :</CaptionUser1>
        <User1>Michel</User1>
        <CaptionUser2>Charge etudes :</CaptionUser2>
        <User2>Adeline</User2>
        <TownProposal>WAZIERS</TownProposal>
        <ClassCategorie>PLAFOND</ClassCategorie>
        <ClassFolder>47 W</ClassFolder>
      (..)
    </PROPOSAL>
    </PROPOSALS>
    Je chercher à prende telle ou telle donnée. Alors je fais comme le code suivant qui fonctionne mais je sents à plein nez que c'est très très mauvais. Avez vous une solution plus optimisée afin que je débute sur de meilleure base ? :

    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
    17
    18
    19
    20
    21
    22
    23
     
    XPathDocument XPathDocu = new XPathDocument(Fichier);
    XPathNavigator Navigator;
    XPathNodeIterator Nodes;
     
    Navigator = XPathDocu.CreateNavigator();
     
    /*----- LECTURE INFO DE BASE-----*/
    XPathExpression xpe = Navigator.Compile("//PROPOSAL/ProposalHour");
    XPathNodeIterator ni = Navigator.Select(xpe);
    while (ni.MoveNext())
    {
       m_fTotalHour = float.Parse(ni.Current.Value);
    }
     
    CultureInfo provider = CultureInfo.InvariantCulture;
    provider = new CultureInfo("fr-FR");
    xpe = Navigator.Compile("//PROPOSAL/StartWork");
    ni = Navigator.Select(xpe);
    while (ni.MoveNext())
    {
        datStart = DateTime.ParseExact(ni.Current.Value, "d", provider);
    }
    Merci

  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 : 46
    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 660
    Points
    7 660
    Par défaut
    Déjà tu n'as pas forcément besoin de compiler l'expression. Tout dépend de l'utilisation qui en est faite (utilisée une fois de temps en temps, souvent, ...).

    Ensuite pour sélectionner un seul noeud il faut utiliser la méthode SelectSingleNode. Tu pourras ainsi supprimer les boucles inutiles.

    Pour finir, si dans le XML la valeur textuelle du nombre d'heures et de la date sont au format xs:double (12.29 par exemple) et xs:datetime (2002-09-24 pour une date seule, 2002-09-24T11:28:03 pour date et heure), on peut simplifier leur récupération.

    Cela donnerait quelque chose comme ça (à tester car je n'ai pas Visual Studio sous la main au moment où j'écris ce code ^^)
    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
     
    XPathDocument XPathDocu = new XPathDocument(Fichier);
    XPathNavigator  Navigator = XPathDocu.CreateNavigator();
     
    XPathNavigator node = Navigator.SelectSingleNode("//PROPOSAL/ProposalHour");
    if (node != null)
    {
        m_fTotalHour = (float)node.ValueAsDouble;
    }
     
    node = Navigator.SelectSingleNode("//PROPOSAL/StartWork");
    if (node != null)
    {
        datStart = node.ValueAsDateTime;
    }
    Tu peux éventuellement faire ça avec une seule expression
    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
    // Récupération des noeuds ProposalHour et StartWork
    XPathNodeIterator ni = Navigator.Select("//PROPOSAL/ProposalHour | //PROPOSAL/StartWork");
    if (ni.Count == 2)
    {
        // Traitement du 1er noeud
        ni.MoveNext();
        m_fTotalHour = float.Parse(ni.Current.Value);
        // Traitement du 2ème noeud
        ni.MoveNext();
        datStart = DateTime.ParseExact(ni.Current.Value, "d", new CultureInfo("fr-FR"));
    }
    else
    {
        // Erreur dans le fichier
        ...
    }

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    C'est super ! J'ai utilisé ton seconde en une seule expression !
    Mille mercis !


    Question en plus : A quoi sert donc la compilation d'une expression si on peut s'en passer ?

Discussions similaires

  1. [RegEx] [preg_match_all] Récupérer valeurs dans XML et créer URLs en fonction
    Par michelfiacre dans le forum Langage
    Réponses: 9
    Dernier message: 16/11/2013, 14h22
  2. [XML] [cURL] Récupérer infos dans XML
    Par zefox dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 20/11/2007, 12h33
  3. Réponses: 1
    Dernier message: 25/04/2007, 17h23
  4. Récupérer valeur dans une BD
    Par Matmal11 dans le forum Linux
    Réponses: 6
    Dernier message: 05/09/2006, 17h28
  5. Récupérer valeur dans un thread
    Par Nasky dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 07/06/2006, 22h37

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