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

Windows Forms Discussion :

Lire, comparer fichiers xml


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut Lire, comparer fichiers xml
    Bonjour
    Voilà,je voudrais compter le nombre d'éléments communs entre 2 fichiers XML.Par exemple:
    <ElementIdentificatorWord.6>
    <name>00652003052</name>
    Si il apparait dans les 2 fichiers avec le même nom,augmenter le compteur de 1.
    Mais je n'ai aucune idée de comment procéder,merci de m'aider.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Existe-il quelque chose permettant de lire un fichier XML,le mettre en string,ensuite il suffirait de parcourir le fichier.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Personne pour m'aider?

  4. #4
    Membre régulier Avatar de maVariable
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 105
    Points
    105
    Par défaut
    'lut
    il existe de nombreuses facon d'utiliser les fichiers XML en C#
    notamment avec les objets XmlDocuments, XmlReader, XmlTextReader.
    Ils contiennent des méthodes qui te permettent ensuite d'isoler des noeuds, de rechercher des noeuds dans un arbre, etc... bref, des choses plus propre que transformation en String et comparaison de String à mon avis.

    Là comme ca je pense que tu devrai utiliser XmlDocument (qui , contrairement aux XmlReader permet un parcours non procédurale, car ce n'est pas juste de la lecture d'un flux), donc te permet de monter et redescendre dans les noeuds. Tu charges tes deux fichiers, tu lance la boucle sur l'un, puis tu compares chaque élément du premier à chaque élément du second. Peut être rajouter des marqueurs pour indiquer ceux déjà trouvés comme identiques..

    Essaye de chercher un peu la dessus, tu trouvera facilement ce que tu cherche.

    Cherche aussi un peu plus loin aussi sur le type de code que tu veux faire, car je suis sur qu'il existe des dll qui contiennent tout ce que tu veux tout fait tout beau et qui marchent bien
    un tiens vaut pas mieux que zéro tu l'auras pas

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Voilà,je bloque.Je voudrais compter le nombre de nom commun entre les 2 xml,c'est à dire par exemple le mot douche dans l'exemple ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ElementIdentificatorWord.6>
    				<name>douche</name>
    Donc je voudrais compter le nombre de nom " commun" aux 2 xml et ensuite dresser une liste de ces noms "communs" aux 2 xml.
    Voici mon code:
    (Je sais qu'il est faux sur pas mal de point,mais c'est juste pour montrer ce que j'ai fait)
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    private void button2_Click(object sender, EventArgs e)
            {
                destination1 = listView1.SelectedItems[0].Text;
                string myPath4 = parentDirectory + "\\" + destination1;
                string Folder1 = listepat2.SelectedItem.ToString();
                string myPath5 = myPath4 + "\\" + Folder1;
                destination = listview.SelectedItems[0].Text;
                String myPath2 = parentDirectory + "\\" + destination;//On concave 2 chaines
                string Folder = listepat.SelectedItem.ToString();
                String myPath3 = myPath2 + "\\" + Folder;
                int compteur = 0;
                int compteur1 = 0;
                int compteur2 = 0;
                XmlDocument doc1 = new XmlDocument();
                XmlDocument doc2 = new XmlDocument();
                doc1.Load(myPath3);
                doc2.Load(myPath5);
     
     
                string str1 = doc1.OuterXml;
                string str2 = doc2.OuterXml;
                if (str1.CompareTo(str2) == 0)
                { //document identique
                    textBox2.Text = "Document identique";
                }
                else
                { //pas identique, alors parcourir les document XML
                    XmlNode root1 = doc1.DocumentElement;
                    XmlNode root2 = doc2.DocumentElement;
                    while ((root1 != null) && (root2 != null))
                    {
                        if (root1.InnerXml == root2.InnerXml)
                        {
                            compteur++;  
                        }
                        if (root1.Name == root2.Name) 
                        {
                            compteur1++;
                        }
                        if (root1.Attributes.Count == root2.Attributes.Count)
                        {
                            compteur2++;         
                        }
                        else
                        { //Comparer le contenu de chaque attribut
                            XmlAttributeCollection att1 = root1.Attributes;
                            XmlAttributeCollection att2 = root2.Attributes;
                            if ((att1 != null) && (att2 != null))
                            {
                                int ind = 0;
                                while (ind < att1.Count)
                                {
                                    if (att1[ind].InnerXml == att2[ind].InnerXml)
                                    {
                                        textBox2.Text = "Le contenu des attributs:'" + att1[ind].Name + "' est identique";
                                    }
                                    ind = ind + 1;
                                }
                            }
                        }
                        if (root1.FirstChild.NodeType == XmlNodeType.Element)
                        {
                            root1 = root1.FirstChild;
                        }
                        else
                        {
                            if (root1.NextSibling == null)
                            {
                                root1 = root1.ParentNode.NextSibling;
                            }
                            else
                            {
                                root1 = root1.NextSibling;
                            }
                        }
                        if (root2.FirstChild.NodeType == XmlNodeType.Element)
                        {
                            root2 = root2.FirstChild;
                        }
                        else
                        {
                            if (root2.NextSibling == null)
                            {
                                root2 = root2.ParentNode.NextSibling;
                            }
                            else
                            {
                                root2 = root2.NextSibling;
                            }
                        }
                    }
                    textBox2.Text = "Nombre 1 : " + compteur.ToString() + "/n" + " Nombre 2 : " + compteur1.ToString() + "/n" + " Nombre 3 : " + compteur2.ToString();
                }
            }
        }
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    J'ai modifié ma fonction pour la rendre plus compréhensible:

    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
     private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    destination = listview.SelectedItems[0].Text;
                    String myPath2 = parentDirectory + "\\" + destination;//On concave 2 chaines
                    string Folder = listepat.SelectedItem.ToString();
                    string sligne = "";
                    String myPath3 = myPath2 + "\\" + Folder;
                    destination1 = listView1.SelectedItems[0].Text;
                    string myPath4 = parentDirectory + "\\" + destination1;
                    string Folder1 = listepat2.SelectedItem.ToString();
                    string sligne1 = "";
                    string myPath5 = myPath4 + "\\" + Folder1;
                    int compteur1 = 0;
                    int compteur2 = 0;
     
                    XmlTextReader lecteur2 = new XmlTextReader(myPath3);
                    XmlTextReader lecteur3 = new XmlTextReader(myPath5);
                    while (lecteur2.Read() != null && lecteur3.Read() != null)
                    {
     
                        if (lecteur2.Name == lecteur3.Name )
                        {
                            compteur1++;
                        }
                    }
                    textBox2.Text = compteur1.ToString();
                }
                catch (Exception ex)
                {
                    textBox2.Text = "erreur fatale";
                }
            }
    Mais je sais toujours pas comment faire pour compter les élement identiques entre 2 balise

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    J'ai refait un code et cette fois,je vois vraiment pas où peut être l'erreur
    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
    private void button2_Click(object sender, EventArgs e)
            {
     
                destination = listview.SelectedItems[0].Text;
                String myPath2 = parentDirectory + "\\" + destination;//On concave 2 chaines
                string Folder = listepat.SelectedItem.ToString();
     
                String myPath3 = myPath2 + "\\" + Folder;
                destination1 = listView1.SelectedItems[0].Text;
                string myPath4 = parentDirectory + "\\" + destination1;
                string Folder1 = listepat2.SelectedItem.ToString();
     
                string myPath5 = myPath4 + "\\" + Folder1;
                int compteur1 = 0;
     
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(myPath3);
                XmlNodeList yDoc = xDoc.SelectNodes("descendant::root.30[elements.9/elements/ElementIdentificatorWord.6]");
                XmlDocument xDoc1 = new XmlDocument();
                xDoc1.Load(myPath5);
                XmlNodeList yDoc1 = xDoc1.SelectNodes("descendant::root.30[elements.9/elements/ElementIdentificatorWord.6]");
                int count = yDoc.Count;
                int count1 = yDoc1.Count;
                int i = 0;
                while ( i < count)
                {
                    if (yDoc == yDoc1)
                    {
                        compteur1++;
                    }
                    i++;
                }
                textBox2.Text = compteur1.ToString();
            }
        }
    Et pourtant cela m'affiche toujours 0

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Personne pour l'aider?Je rame vraiment là

  9. #9
    Membre régulier Avatar de maVariable
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 105
    Points
    105
    Par défaut
    heu...
    soit je comprend mal ton code, soit tu recois toujours 0 simplement parceque tu n'incrémentes rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (yDoc == yDoc1)
    --> tu as beau avoir un compteur, si tu n'utilise pas ce compteur pour "parcourir" séquentiellement tes noeuds (un genre yDoc[compteur], etc..), tu ne vas pas aller loin.
    -->pour comparer deux listes de cette facon, il te faut deux compteurs à priori.
    --> tu test ici l'égalité entre deux XmlNodeList ( plusieurs fois) ?? .. qui ne sont pas égales (d'ou ton 0 à la fin).
    -->ce type de test me semble très étrange... il y a des méthodes plus propres je suppose. Mais je peux me tromper évidement
    -->je vais essayer de trouver un bout de code
    un tiens vaut pas mieux que zéro tu l'auras pas

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Comment puis-je utiliser le compteur pour parcourir séquentiellement mes noeuds?
    avec xml node list je récupére la liste de mes noeuds,d'ailleur à ce propos,je ne sais pas comment marche les chemins xml,c'est à dire "root.30/elements.9/elements/ElementIdentificatorWord.6".Moi je veux récupéré le mot douche par exemple dans l'exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <root.30>
    	<elements.9>
    		<elements>
    			<ElementIdentificatorWord.6>
    				<name>douche</name>

  11. #11
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2006
    Messages : 152
    Points : 131
    Points
    131
    Par défaut
    Tu connais le schéma du fichier XML ou tu veux compter tous les éléments 'name' et uniquement ceux-ci, peu importe sous quelle arborescence on les trouve ?

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Non je ne connais pas l'arborescence,je veux que dès qu'il y a une balise name,il me choppe le nom,il incrémente le compteur et qu'il récupére chaque mot entre les 2 balise name et ensuite le mette dans une liste que je puisse récupéré pour l'afficher

  13. #13
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2006
    Messages : 152
    Points : 131
    Points
    131
    Par défaut
    Implémente, corrige puis utilise la méthode suivante.
    Ce code utilise l'espace de nom 'System.Xml.XPath'.
    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
     
            /// <summary>
            /// Recherche dans un fichier de type XML, <br/>
            /// tous les éléments d'un nom donné et renvoie la liste de leur valeur.
            /// </summary>
            /// <param name="sXMLFileFullPath">Chemin complet d'un fichier XML</param>
            /// <param name="sNodeName">Nom d'un élément (balise XML)</param>
            /// <returns>La liste de la valeur des éléments, une liste vide si aucun élément trouvé.</returns>
            private System.Collections.IList ParseXMLElement(string sXMLFileFullPath, string sNodeName)
            {
                System.Collections.IList lstNodes = new System.Collections.ArrayList();
                XPathDocument xpathDoc = new XPathDocument(sXMLFileFullPath);
                XPathNavigator xmlNav = xpathDoc.CreateNavigator();
                XPathNodeIterator xmlIterator = xmlNav.Select("/" + sNodeName);
                while (xmlIterator.MoveNext())
                {
                    lstNodes.Add(xmlIterator.Current.Value);
                }
                return null;
            }
    Sam;

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Peux-tu être plus précis?
    Merci

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    Voilà j'ai modifié mon prog,mais cela ne march toujours pas,voici mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    destination = listview.SelectedItems[0].Text;
                String myPath2 = parentDirectory + "\\" + destination;//On concave 2 chaines
                string Folder = listepat.SelectedItem.ToString();
     
                String myPath3 = myPath2 + "\\" + Folder;
                destination1 = listView1.SelectedItems[0].Text;
                string myPath4 = parentDirectory + "\\" + destination1;
                string Folder1 = listepat2.SelectedItem.ToString();
     
                string myPath5 = myPath4 + "\\" + Folder1;
                int compteur1 = 0;
     
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(myPath3);
                XmlElement sydoc = xDoc.DocumentElement;
                XmlNodeList yDoc = sydoc.GetElementsByTagName("name");
                XmlDocument xDoc1 = new XmlDocument();
                xDoc1.Load(myPath5);
                XmlElement sydoc1 = xDoc1.DocumentElement;
                XmlNodeList yDoc1 = xDoc1.GetElementsByTagName("name");
                int count = yDoc.Count;;
                int count1 = yDoc1.Count;
                int i = 0;
                while (i < count)
                {
                    if (yDoc == yDoc1)
                    {
                        compteur1++;
                    }
                    i++;
                }
                textBox2.Text = compteur1.ToString();
            }
        }
    Merci de m'aider à avancer,ça fait longtemps que je bloque sur comment comparer 2 xml

  16. #16
    Membre régulier Avatar de maVariable
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 105
    Points
    105
    Par défaut
    je me demande si tu lis les réponses qu'on te donne...
    Comme je te l'ai expliqué plus haut, ton test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (i < count)
                {
                    if (yDoc == yDoc1)
                    {
                        compteur1++;
                    }
                    i++;
                }
    ne fait rien du tout il me semble, il ne fait que comparer plusieurs fois (de 0 à "count") deux instances d'objets, deux pointeurs en somme. (hésitez pas à me corriger si je me trompe )

    XmlNodeList est, comme son nom l'indique, une liste de node, tu t'en doute. Donc si tu veux comparer chacun de ces nodes, il faut commencer par faire une itération sur les éléments de tes listes, et non comparer les deux listes d'un coup, même si chacune de ces listes ne contient qu'un node.

    Et une fois que tu es sur un XmlNode, il faut voir un peu plus loin car si j'ai bien compris, tu veux comparer les valeurs "textuelles" de tes noeuds. Ils faudra donc écrire quelque chose comme XmlNode.innertext (si je me rappel bien).

    Enfin, dans le cas ou tes listes n'ont pas le même nombre de Node, il faut que tu les parcours toutes les deux indépendement l'une de l'autre. Accessoirement, si tes valeurs identiques ne sont pas placées au même endroit dans le fichier, il serait interessant de comparer tous les nodes de la première liste à tous les nodes de la deuxième liste.

    Voila un exemple, pondu à la volée (pas testé, non garantie), fonctionnant à priori uniquement si les Nodes sont des feuilles (c'est à dire qu'ils n'ont pas d'enfant, pas de sous noeuds).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                XmlNodeList list1 = new XmlNodeList();
                XmlNodeList list2 = new XmlNodeList();
                int cpt = 0;
                foreach (XmlNode node1 in list1)
                {
                    foreach (XmlNode node2 in list2)
                    {
                        if (node1.InnerText.Equals(node2.InnerText))
                        {
                            cpt++;
                        }
                    }
                }
    nb : cpt n'a d'impact sur le parcours des listes, il ne fait que compter le nombre de fois que le test d'égalité retourne vrai.

    Si tu es sûr que chacune de tes listes ne contient qu'un seul élément, tu peux à la rigueur réduire le tout à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                int cpt = 0;
                if (list1[0].InnerText.Equals(list2[0].InnerText))
                {
                    cpt++;
                }
    ...mais il est souvent déconseillé de mettre des valeurs statiques, surtout dans les parcours de liste.

    Espérant que ca puisse te faire avancer
    un tiens vaut pas mieux que zéro tu l'auras pas

  17. #17
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2006
    Messages : 152
    Points : 131
    Points
    131
    Par défaut
    Tu n'essaies pas d'utiliser la méthode que j'ai écrite pour toi ?

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    sanworld --> J'ai essayer de l'appliquer mais cela ne fonctionnait pas,je vais essayer de trouver la solution

    maVariable --> Merci pour cette réponse,j'ai compris m on erreur,je vais essayer de finir mon prog ce matin.

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 31
    Points
    31
    Par défaut
    J'ai lu qu'il existe une méthode parfaite pour ceux que je veux faire.
    voici le : http://www.codeproject.com/KB/cpp/myXPath.aspx

    Et voici mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    XPathDocument doc = new XPathDocument(filename);
                XPathDocument doc1 = new XPathDocument(filename1);
                XPathNavigator nav = doc.CreateNavigator();
                XPathNavigator nav1 = doc1.CreateNavigator();
     
                XPathExpression expr;
                XPathExpression expr1;
                expr = nav.Compile("/root.30/elements.9/elements/ElementIdentificatorWord.6/name");
                expr1 = nav1.Compile("/root.30/elements.9/elements/ElementIdentificatorWord.6/name");
                XPathNodeIterator ite = nav.Select(expr);
                XPathNodeIterator ite1 = nav1.Select(expr1);
                int cpt = 0;
     
                try
                {
                    while (ite.MoveNext() && ite1.MoveNext())
                    {
                        XPathNavigator nav2 = ite.Current.Clone();
                        XPathNavigator nav3 = ite1.Current.Clone();
                        if (nav2.Value == nav3.Value)
                        {
                            cpt++;
                            listBox1.Items.Add("name: " + nav2.Value);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("erreur");
                }
    Cela marche parfaitement bien ,merci de votre aide en tout cas
    C'est mieux de poster son code une fois qu'on a la solution je trouve,car cela aide des gens comme moi qui ont besoin de faire ce genre de chose.

  20. #20
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2006
    Messages : 152
    Points : 131
    Points
    131
    Par défaut
    C'est la piste que j'avais donnée. La méthode 'ParseXMLElement' avait juste un "slash" manquant pour être fonctionnelle.

    Pour compter le nombre d'éléments d'un nom donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string sXMLFileFullPath = "../../res_data/DataGridView1.xml";
    string sNodeName = "Intitule";
    System.Collections.IList lst = ParseXMLElement(sXMLFileFullPath, sNodeName);
    //int size = lst.Count;
    avec :
    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
            /// <summary>
            /// Recherche dans un fichier de type XML, <br/>
            /// tous les éléments d'un nom donné et renvoie la liste de leur valeur.
            /// </summary>
            /// <param name="sXMLFileFullPath">Chemin complet d'un fichier XML</param>
            /// <param name="sNodeName">Nom d'un élément (balise XML)</param>
            /// <returns>La liste de la valeur des éléments, une liste vide si aucun élément trouvé.</returns>
            public static System.Collections.IList ParseXMLElement(string sXMLFileFullPath, string sNodeName)
            {
                System.Collections.IList lstNodes = new System.Collections.ArrayList();
                System.Xml.XPath.XPathDocument xpathDoc = new XPathDocument(sXMLFileFullPath);
                XPathNavigator xmlNav = xpathDoc.CreateNavigator();
                XPathNodeIterator xmlIterator = xmlNav.Select("//" + sNodeName);
                while (xmlIterator.MoveNext())
                {
                    lstNodes.Add(xmlIterator.Current.Value);
                }
                return lstNodes;
            }
    Sam;

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

Discussions similaires

  1. Créer et lire un fichier xml
    Par Bruno1905 dans le forum C++Builder
    Réponses: 14
    Dernier message: 13/06/2007, 11h11
  2. Réponses: 1
    Dernier message: 17/01/2006, 07h42
  3. [DOM XML] Lire un fichier xml
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 07/12/2005, 22h36
  4. lire un fichier xml
    Par stephanie5 dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/11/2005, 16h34
  5. Comment lire un fichier XML ?
    Par jeromelef dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2005, 15h52

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