Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] XmlNodeList ne retourne que le premier noeud

Sujet résolu
    18 septembre 2017 à 11:06:43

    Bonjour à tous ! Venant à bout de mon projet , il ne me reste que quelques détails à regler , et le plus important est le suivant : Devant ittérer dans des fichiers XML de 3 types , le premier type est correctement lu et intégré dans la base , ayant un seul type de " noeuds " par " attribut" . Le problème étant que pour les 2 autres types de fichiers , chaque " attribut"  ( balise d'en tête réunissant un nom de société et une date de traitement ) , contient plusieurs fois la même balise , avec des informations différentes ( exp : des balises bilans pour la même société  , mais avec des dates différentes ) , le problème étant que lors de l'utilisation de mon programme , seulement les premiers  nœuds de chaque attribut sont lu/intégrés . J'ai tout essayer , des méthodes childnodes aux boucles dégueulasses , ci -joint un bout de code d'un des deux types de fichiers concernés . 

    Merci d'avance pour votre lecture et votre compréhension . 

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2017 à 18:27:45

      Hello,

      Le bouton </> sert à poster du code et à éviter les captures d'écran.
      Un exemple du fichier XML qui ne fonctionne pas ?

      Un exemple de ce que tu cherches à faire avec ton code ?

      • Partager sur Facebook
      • Partager sur Twitter
      Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
        19 septembre 2017 à 9:33:05

        Bonjour Pyro  , oui j'ai totalement oublier les balises .  
        En gros ça  stock les données dans un model {get;set;} ensuite j'ai mes requêtes SQL Server paramétrées . Mon seul problème est que comme dans ce type de fichier il y'a plusieurs fois la même balise "bils "(avec des infos différentes dedans ) ça fait que mon programme s'arrête à chaque fois à la première balise avant de passer au prochain attribut :/
        • Partager sur Facebook
        • Partager sur Twitter
          19 septembre 2017 à 11:27:04

          On peut avoir la requête XPath qui a été "caviardé" ?
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            19 septembre 2017 à 11:49:04

             //Fichier BIL
                    public static List<BIL> GetSocietiesBIL(string xmlDocPath)
                    {
                       //Extraction des données contenues dans le fichier BIL 
                        XmlDoc.Load(xmlDocPath);
            
                        Nsmgr.AddNamespace("x", "fr:inpi:odrncs:serpentXML");
            
                        var societiesBIL = new List<BIL>();
                        var fileNode = XmlDoc.SelectSingleNode("x:fichier", Nsmgr);
                        var typeDoc = fileNode?.Attributes?["type"]?.Value;   //Controle du champ type qui correspond à la nature du fichier 
                    
                        XmlNodeList societyNodes = XmlDoc.SelectNodes("//x:fichier/x:grf/x:societe", Nsmgr);
                        
                        if (societyNodes != null)
                            if (typeDoc == "BIL")
                        { 
                            {
                                    foreach (XmlNode societyNode in societyNodes)
                                    {
            
                                        foreach (XmlNode bil in societyNodes)
                                       
            
                                        {
                                                var society = new BIL
                                                {
            
                                                    Num_gestion = societyNode.Attributes["num_gestion"].Value,
                                                    Dat_donnees = societyNode.Attributes["dat_donnees"].Value,
            
                                                    date_cloture_aa = societyNode.SelectSingleNode("x:bils/x:bil/x:date_cloture_aa", Nsmgr)?.InnerXml,
                                                    dat_depot = societyNode.SelectSingleNode("x:bils/x:bil/x:dat_depot", Nsmgr)?.InnerXml,
                                                    confid_ind = societyNode.SelectSingleNode("x:bils/x:bil/x:confid_ind", Nsmgr)?.InnerXml,
                                                    confid_ind_CR = societyNode.SelectSingleNode("x:bils/x:bil/x:confid_ind_CR", Nsmgr)?.InnerXml,
                                                    num_depot = societyNode.SelectSingleNode("x:bils/x:bil/x:num_depot", Nsmgr)?.InnerXml,
                                                    dat_cloture_jjmm = societyNode.SelectSingleNode("x:bils/x:bil/x:dat_cloture_jjmm", Nsmgr)?.InnerXml,
            
                                                };
            
                                                societiesBIL.Add(society);
            
                                         }
                                      }
                                    
                                }
                        }
                        else
                        {   
                            throw new Exception("Il n'y a pas de noeuds 'societe' dans ce fichier BIL");
                            
                        }
            
                        return societiesBIL;
                    }
            Et voici un screen d'exemple de fichier traiter : Le probléme est que seulement la premiere balise " bil" de chaque attribut " societe " est lu et stockée :/ 
            • Partager sur Facebook
            • Partager sur Twitter
              19 septembre 2017 à 12:45:32

              Ligne 22, vous "bouclez" sur les "bils", pas sur les "bil".
              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                19 septembre 2017 à 13:55:46

                Malheureusement j'ai déja essayé , rien du tout ça prends toujours seulement le premier noeud bil .. et si je prends bils à la place de bil ça me fait plusieurs fois la premiére valeur , ce qui est déja une avancée en soi .

                EDIT: en rajoutant un " foreach XmlNode bil in bils " j'obtiens X fois les même valeur , mais ça correspond déja au nombre de noeuds , il me reste à trouver pourquoi ça ne mets pas chaque valeur singuliére 

                -
                Edité par MalikDrir 19 septembre 2017 à 14:02:50

                • Partager sur Facebook
                • Partager sur Twitter
                  19 septembre 2017 à 14:12:18

                  >Malheureusement j'ai déja essayé , rien du tout ça prends toujours seulement le premier noeud bil

                  Vous avez essayé quoi ? Le code SVP.

                  Parce qu'avec votre machin, c'est 3 foreach imbriqués qu'il vous faut, pas 2.

                  Moi, j'aurais fait un XPath qui viserait les "bil" directement, quitte à faire un XPath "montant" l'arborescence pour récupérer les données des éléments parents.

                  (le "foreach in" d'XmlNode ne déroule que les nodes fils, pas les nodes "petit-fils" et les nodes societe n'ont qu'un fils.)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    19 septembre 2017 à 14:18:03

                            XmlNodeList societyNodes = XmlDoc.SelectNodes("//x:fichier/x:grf/x:societe", Nsmgr);
                                
                                if (societyNodes != null)
                                    if (typeDoc == "BIL")
                                { 
                                    {
                                            foreach (XmlNode societyNode in societyNodes)
                                            {
                    
                                                foreach (XmlNode bils in societyNode)
                                                {
                                                    foreach (XmlNode bil in bils)
                    
                                                    {
                                                        var society = new BIL
                                                        {
                    
                                                            Num_gestion = societyNode.Attributes["num_gestion"].Value,
                                                            Dat_donnees = societyNode.Attributes["dat_donnees"].Value,
                    
                                                            date_cloture_aa = societyNode.SelectSingleNode("x:bils/x:bil/x:date_cloture_aa", Nsmgr)?.InnerXml,
                                                            dat_depot = societyNode.SelectSingleNode("x:bils/x:bil/x:dat_depot", Nsmgr)?.InnerXml,
                                                            confid_ind = societyNode.SelectSingleNode("x:bils/x:bil/x:confid_ind", Nsmgr)?.InnerXml,
                                                            confid_ind_CR = societyNode.SelectSingleNode("x:bils/x:bil/x:confid_ind_CR", Nsmgr)?.InnerXml,
                                                            num_depot = societyNode.SelectSingleNode("x:bils/x:bil/x:num_depot", Nsmgr)?.InnerXml,
                                                            dat_cloture_jjmm = societyNode.SelectSingleNode("x:bils/x:bil/x:dat_cloture_jjmm", Nsmgr)?.InnerXml,
                    
                                                        };
                    
                                                        societiesBIL.Add(society);
                    
                                                    }
                    
                                                }
                                             }
                                            
                                        }
                                }
                    Avec cette boucle la j'ai le bon nombre de nœuds par attributs , mais la première valeur se répète à chaque fois . Une idée ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 septembre 2017 à 14:44:31

                      Parce que vous utilisez "societyNode" à la place de "bil" pour vos SelectSingleNode.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        19 septembre 2017 à 14:57:11

                        Avec votre solution c'est encore pire aucun noeud n'est lu je n'ai que des valeurs nulles .. Je séche vraiment  , je vais tester quelques solutions et je reviendrais vers vous .

                        EDIT : Sujet résolu ! 

                        -
                        Edité par MalikDrir 19 septembre 2017 à 15:21:56

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 septembre 2017 à 15:30:23

                          >Avec votre solution c'est encore pire

                          Là quelle ?

                          >EDIT : Sujet résolu !

                          Alors, c'était quoi le problème ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                            19 septembre 2017 à 15:46:09

                            C'était au niveau de la syntaxe de mon namespacemanager et de ma boucle , j'avais mal agencé certaines requête de lecture du XMl . Desolé du dérangement et mille fois merci !
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [C#] XmlNodeList ne retourne que le premier noeud

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown