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 .
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 :/
//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 :/
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
>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.)
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
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
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 !
[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.
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 :/
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 ?