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 d'un noeud d'un fichier XML [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut récupérer valeur d'un noeud d'un fichier XML
    Bonjour,

    Je souhaiterai récupérer les valeurs de noeud bien particulier dans un fichier XML dont voici l'architecture:

    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
    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
     
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <configuration>
      <SynchronizationMode>
        <Mode>Interval</Mode>
        <!--Choisir le mode de synchronisation:Interval,Daily-->
        <IntervalMinutes>1</IntervalMinutes>
        <!--En cas de Mode Interval, choisir pour value le délai en minute-->
        <ScheduledTime>16:22</ScheduledTime>
        <!--En cas de Mode Daily, choisir pour value l'heure de synchronisation du type HH:MM-->
      </SynchronizationMode>
      <FolderSetting>
        <SourceFolder>
          <SourcePath>C:\Temp</SourcePath>
          <!--En cas de fichier distant, mettre une adresse du type \SERVEUR\Dossier-->
          <SourceLogin></SourceLogin>
          <!--Laisser vide si dossier local-->
          <SourcePassword></SourcePassword>
          <!--Laisser vide si dossier local-->
          <FileType>.txt</FileType>
          <!--Choisir le type de fichier a transferer: .txt ,.csv-->
        </SourceFolder>
        <DestinationFolder>
          <DestFolder>C:\Temp2</DestFolder>
        </DestinationFolder>
      </FolderSetting>
      <ConversionSetting>
        <ConversionActive>YES</ConversionActive>
        <!--Pour déplacer sans conversion, mettre sur NO-->
        <NumberOfFields>8</NumberOfFields>
        <!--indiquer le nombre de champs dans le fichier d'origine-->
        <FieldDelimiter>|</FieldDelimiter>
        <!--Indiquer le séparateur de champ-->
        <Fields>
          <INSTRUMENT>
            <Instrument_IDField>1</Instrument_IDField>
            <!--Indiquer le Champ correspondant à l'identifiant de l'automate-->
          </INSTRUMENT>
          <QC>
            <QC_LotNumberField>2</QC_LotNumberField>
            <!--Indiquer le Champ correspondant au numero de lot-->
            <QC_LevelField>3</QC_LevelField>
            <!--Indiquer le Champ correspondant au niveau du QC-->
          </QC>
          <TEST>
            <Test_IDField>4</Test_IDField>
            <!--Indiquer le Champ correspondant à l'identifiant du test-->
            <Test_ResultField>5</Test_ResultField>
            <!--Indiquer le Champ correspondant au résultat du test-->
          </TEST>
          <DATE>
            <Date_Field>6</Date_Field>
            <!--Indiquer le Champ correspondant à la date-->
            <Date_Format>DD/MM/YYYY</Date_Format>
            <!--Indiquer le format de la date en mettant des X pour les caracteres à ne pas prendre en compte. ex: DDXMMXYYYY-->
          </DATE>
          <HOUR>
            <Hour_Field>7</Hour_Field>
            <!--Indiquer le Champ correspondant à l'heure-->
            <Hour_Format>HHMMSS</Hour_Format>
            <!--Indiquer le format de l'heure en mettant des X pour les caracteres a ne pas prendre en compte. ex: HHXMMXSS-->
          </HOUR>
        </Fields>
      </ConversionSetting>
    </configuration>
    Je souhaite recuperer la valeur d'un noued particulier, par exemple le noeud "Mode" au format string.

    J'ai testé cela mais ça ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    XDocument doc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "\\Config.xml");
     
     Service1.mode = doc.Element("Mode").Value.ToString().ToUpper();
    Une idée?

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    voilà un exemple de code qui utilise un XPath pour trouver ton noeud.
    Il utilise les objets de System.Xml et non ceux de System.Xml.Linq :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    XmlDocument doc = new XmlDocument();
    doc.Load(@"C:\tmp\conf.xml");
    if (doc != null) {
    	XmlNodeList nodes = doc.SelectNodes("//configuration/SynchronizationMode/Mode");
    	if (nodes != null) {
    		if (nodes.Count > 0) MBX(nodes[0].InnerText);
    		else MBX("SelectNodes returns no node");
    	} else MBX("SelectNodes failed");
    } else MBX("Load file failed");
    Bon dev.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    Salut

    Merci pour ton exemple.

    Par contre, ce n'est pas possible de faire ce que je veux avec LINQ? En effet, j'utilise LINQ pour créer mon fichier XML et je souhaiterai reste sur le même modèle.

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Avec Linq, si tu inclues l'espace de noms System.Xml.XPath, tu peux accéder à des méthodes d'extensions supplémentaires et effectuer des requêtes XPATH :
    • XPathSelectElement, pour ne sélectionner qu'un seul noeud (le premier s'il y en a plusieurs) ;
    • XPathSelectElements pour sélectionner une collection de noeuds ;
    • XPathEvaluate pour évaluer une expression XPATH (par exemple, renvoyer directement la valeur d'un attribut).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Voilà, dorinf a répondu
    Si tu veux connaitre la syntaxe des XPath tu trouveras ça facilement sur wiki, msdn ou simplement google.
    Plus je connais de langages, plus j'aime le C.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    Salut à tous,

    Merci pour vos éclaircissements.

    Pour le moment je suis arrivé à faire ce que je voulais mais sans LINQ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    XmlDocument doc = new XmlDocument();
                    doc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\Config.xml");
     
                    Service1.mode = doc.SelectSingleNode("configuration/SynchronizationMode/Mode").InnerText.ToUpper().ToString();
                    Service1.mDaily = doc.SelectSingleNode("configuration/SynchronizationMode/ScheduledTime").InnerText.ToString();
    Je souhaiterai maintenant faire la même chose avec LINQ (histoire de ne pas mourrir bête )

    Faisable aussi simplement avec XPATH?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    re,

    apparemment cela semble faisable facilement avec un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Service1.mode = (string)xml.XPathEvaluate("configuration/SynchronizationMode/Mode");
    je teste cela demain.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    Bon ben j'ai parlé trop vite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Service1.mode = (string)xml.XPathEvaluate("configuration/SynchronizationMode/Mode");
    Mon exemple me retoune: System.Xml.XPath.XPathEvaluator+<EvaluateIterator>d__0`1[System.Object]

    Une idée à me soumettre?

  9. #9
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Peut être ceci ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    Service1.mode = (string)xml.XPathEvaluate("configuration/SynchronizationMode/Mode/text()");
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  10. #10
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    exemple avec un XPathSelectElement plutôt que qu'un XPathEvaluate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    XDocument doc = XDocument.Load(@"C:\tmp\conf.xml");
    if (doc != null) {
    	XElement modeElement = doc.XPathSelectElement("//configuration/SynchronizationMode/Mode");
    	if (modeElement != null)
    		MBX("'mode' tag value : " + modeElement.Value);
    	else MBX("no 'mode' tag");
    } else MBX("error loading xml file");
    Bon dev.
    Plus je connais de langages, plus j'aime le C.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    @François: Perdu

    @jopopmk: C'est parfait. Je passe le sujet en résolu.

    Encore merci à vous pour votre aide.

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

Discussions similaires

  1. [XL-2003] récupérer valeur d'une cellule, dans plusieurs fichiers placés dans des sous-dossiers
    Par greenfire15 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/08/2012, 09h42
  2. Récupérer le nom d'un noeud dans un fichier xml
    Par amirad dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/06/2009, 18h20
  3. [DOM] Modifier la valeur d'un noeud dans un fichier XML
    Par rob2-9 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/08/2008, 20h31
  4. [DOM] Récupérer le nom du premier noeud d'un fichier XML en PHP
    Par ePsymon dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/02/2008, 09h17
  5. Récupérer les valeurs d'un noeud dans un fichier XML
    Par yosthegost dans le forum Delphi
    Réponses: 1
    Dernier message: 30/05/2006, 17h38

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