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 :

Recuperer les elements d'un XML


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut Recuperer les elements d'un XML
    Salut
    je suis pas trop doué pour ce qui concerne la manipulation des fichiers XML en vb.net
    bref
    mon probleme le voila:
    je veux recuperer les elements d'un fichier XML :

    Exemple:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <products>
              <product>
                      <id>1</id>
                      <price>50</price>
                      <vendor>text</vendor>
              </product>
     
              <order>
                      <id>10</id>
              </order>
    </products>



    1-je veux recuperer l'element racine
    2-je veux recuperer le(s) element(s) du noeud product (id, price, vendor)
    3-je veux recuperer le(s) element (s) du noeud order(id)



    bon j'ai pu faire un bout de code qui marche pas mal; mais le probleme dans ce code c'est que je dois connaitre le nombre des elements que j'ai


    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
     ' creation d'une nouvelle instance du membre xmldocument
            Dim XmlDoc As XmlDocument = New XmlDocument()
            'Chargement du fichier XMl
            XmlDoc.Load("chemin fichier xml")
            'Declaration d'une liste de Noeud
            Dim xmlnodeList As XmlNodeList
     
            xmlnodeList = XmlDoc.ChildNodes
     
            MsgBox(xmlnodeList.ItemOf(0).ChildNodes.ItemOf(0).Name)
            MsgBox(xmlnodeList.ItemOf(0).ChildNodes.ItemOf(1).Name)
     
            MsgBox(xmlnodeList.ItemOf(0).ChildNodes.ItemOf(0).ChildNodes.ItemOf(0).Name)
            MsgBox(xmlnodeList.ItemOf(0).ChildNodes.ItemOf(0).ChildNodes.ItemOf(1).Name)
            MsgBox(xmlnodeList.ItemOf(0).ChildNodes.ItemOf(0).ChildNodes.ItemOf(2).Name)
    est ce qu'il existe un moyen pour regler ce prb ?
    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Déjà première chose tu peux utiliser une boucle pour parcourir les éléments d'un même niveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For Each element In XmlDoc.ChildNodes
       MsgBox(element.Name)
    Next
    Maintenant pour progresser en profondeur dans ton arborescence, utilise la récursivité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Sub ParcourirElement(ByVal element as XmlElement)
       Dim elem As XmlElement
     
       For Each elem In element.ChildNodes
          MsgBox(elem.Name)
          If elem.ChildNodes.Count > 0 Then
             ParcourirElement(elem)
          End If
       Next
    End Sub

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    Tout dabord je vous remercie de m'avoir repondu ce qui n'est pas le cas dans les autres Forum.


    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
     
    ' creation d'une nouvelle instance du membre xmldocument
            Dim XmlDoc As XmlDocument = New XmlDocument()
     
            'Chargement du fichier XMl
            XmlDoc.Load(fileName)
     
            'Declaration d'une liste de Noeud
            Dim xmlnodeList As XmlNodeList
     
     
            'Parcouri le fichier XML et afficher l'lement Racine
            xmlnodeList = XmlDoc.ChildNodes
            For Each element In XmlDoc.ChildNodes
                MsgBox(element.Name)
            Next
     
     
     
     'Parcouri le fichier XML et afficher les autres elements
            Dim myxmlelement As XmlElement = XmlDoc.DocumentElement
     
            ParcourirElement(myxmlelement)
     
     
     
    'La fonction
     
     
    Public Sub ParcourirElement(ByVal element As XmlElement)
     
            Try
                Dim elem As XmlElement
                For Each elem In element.ChildNodes
                    MsgBox(elem.Name)
                    If elem.ChildNodes.Count > 0 Then
                        ParcourirElement(elem)
                    End If
                Next
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub


    Bon voila le code quand j'execute la 1ere partie marche impek j'arrive a afficher l'lement racine mais pour le reste j'arrive a afficher les autres element par la fonction mais ya une exception quii se genere entre chaque affichage d'element

    je sais pas trop pourquoi!!
    Merci d'avance

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    Quand je modifie mon XML de telle sorte :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <products>
              <product>
                      <id/>
                      <price/>
                      <vendor/>
              </product>
     
              <order>
                      <id/>
              </order>
    </products>

    j'obtiens tous les champs sans aucun probleme; si ca peut vous etre util

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Tu trouveras moulte tuto (sur ce site entre autres) sur comment parser un fichier XML,

    les deux grandes instructions sont

    x = xmlDoc.Childnodes(y).childNodes(z)....childNodes(n).count => connaitre le nombre de données qu'il y a sur un niveau

    texte = xmlDoc.childNodes(0).childNodes(3).childNodes(1).text => récupérer la valeur


    après, pour gagner du temps pour l'ajout d'un jeu de données, j'ai une technique, je crée un jeu modèle et j'utilise cloneNode pour le dupliquer et je viens écrire après la valeur qui m'interresse.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Ya7yaKech Voir le message
    Bon voila le code quand j'execute la 1ere partie marche impek j'arrive a afficher l'lement racine mais pour le reste j'arrive a afficher les autres element par la fonction mais ya une exception quii se genere entre chaque affichage d'element

    je sais pas trop pourquoi!!
    Merci d'avance
    Quelle est l'exception levée (type + message) ?

    Merci

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    titre :L'exception InvalidCastException n'a pas été gérée

    Impossible d'effectuer un cast d'un objet de type 'System.Xml.XmlText' en type 'System.Xml.XmlElement'.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Je me suis trompé. Il ne faut pas utiliser XmlElement mais XmlNode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Sub ParcourirElement(ByVal noeudParent as XmlNode)
       Dim noeudEnfant As XmlNode
     
       For Each noeudEnfant In noeudParent.ChildNodes
          MsgBox(noeudEnfant.Name)
          If noeudEnfant.ChildNodes.Count > 0 Then
             ParcourirElement(noeudEnfant)
          End If
       Next
    End Sub

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    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
    Dim fileName As String = "Fichier XML"
     
        Public Sub ParcourirElement(ByVal noeudParent As XmlNode)
            Try
                Dim noeudEnfant As XmlNode
                For Each noeudEnfant In noeudParent.ChildNodes
                    MsgBox(noeudEnfant.Name)
                    If noeudEnfant.ChildNodes.Count > 0 Then
                        ParcourirElement(noeudEnfant)
                    End If
                Next
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' creation d'une nouvelle instance du membre xmldocument
            Dim XmlDoc As XmlDocument = New XmlDocument()
            'Chargement du fichier XMl
            XmlDoc.Load(fileName)
     
            Dim mynoeudParent As XmlNode = XmlDoc.ParentNode
            ParcourirElement(mynoeudParent)
        End Sub
    Bon voila le code que j'ai fais (grace a toi bien sur)
    mais il affiche une exception :
    "La référence d'objet n'est pas définie à une instance d'un objet."

    tout en selectionnant en jaune la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each noeudEnfant In noeudParent.ChildNodes
    je pense que ma declaration n'est pas convenable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dim mynoeudParent As XmlNode = XmlDoc.ParentNode
    car quand je la remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim mynoeudParent As XmlNode = XmlDoc.FirstChild
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim mynoeudParent As XmlNode = XmlDoc.LastChild
    apparament ca marche.(je sais pas trop ou est la différence; etsi je l'applique sur un autre fichier est ce que ce marchera !!)

    qu'est ce que vous en pensé?

    Merci

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    XmlDocument.ParentNode
    Citation Envoyé par MSDN
    Retourne toujours une référence null (Nothing en Visual Basic).
    Ce qui est un peu normal, vu qu'un XmlDocument ne peut pas avoir de noeud parent...

    Dans la méthode Button1_Click, utilise XmlDoc.DocumentElement à la place de XmlDoc.ParentNode

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' creation d'une nouvelle instance du membre xmldocument
            Dim XmlDoc As XmlDocument = New XmlDocument()
            'Chargement du fichier XMl
            XmlDoc.Load(fileName)
     
            Dim mynoeudParent As XmlNode = XmlDoc.DocumentElement
            ParcourirElement(mynoeudParent)
        End Sub

    il me donne le resultat mais en plus il me donne "#text"
    je pense qu'il affiche aussi les valeurs des elements car quand je donne un xml avec des champs vide il affiche le resultat correctement

    est ce qu'il existe une solution pour que le programme ignore la valeur du champs et qu'il affiche tout simplement l'lement?

    merci

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Ya7yaKech Voir le message
    il me donne le resultat mais en plus il me donne "#text"
    C'est parce que un morceau de texte dans un element (par exemple "50" dans "<price>50</price>") est aussi considéré comme un noeud, dont le nom est "#text". Si tu veux afficher sa valeur, il faut afficher la Value du XmlNode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If noeudEnfant.NodeType = XmlNodeType.Element Then
        MsgBox(noeudEnfant.Name)
    Else If noeudEnfant.NodeType = XmlNodeType.Text Then
        MsgBox(noeudEnfant.Value)
    End If

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    Non au contraire ce qui m'intersesse c'est juste les elements : id , price, vendor ..
    je veux pas afficher les valeurs

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    eh ben dans ce cas tu n'as qu'à ignorer les nœuds qui ne sont pas des éléments...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If noeudEnfant.NodeType = XmlNodeType.Element Then
        MsgBox(noeudEnfant.Name)
    End If

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    oui c'est ce ke j'ai fais merci beaucoup

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    pense au bouton si c'est OK...

  17. #17
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    ok je vais le faire je m'excuse de l'avoir oublier
    mais juste une question
    supposons que je connais le nom d'un champs par exemple "Id" mais je ne cionnais pas sa position par rapport au fichier XML et que je veux chercher sa valeur.

    c'est possible ??
    a noter qu'on peut avoir plusieur id comme ceci

    Code XML : 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
    <Articles>
    <Article>
     
    <id>1</id>
    <name>text</name>
     
    </Article>
     
    <Article>
     
    <id>2</id>
    <name>text</name>
     
    </Article>
     
    <Article>
     
    <id>1</id>
    <name>text</name>
     
    </Article>
    </Articles>

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu peux utiliser XPath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim document As XPathDocument = New XPathDocument("articles.xml")
    Dim navigator As XPathNavigator = document.CreateNavigator()
    Dim nodes As XPathNodeIterator = navigator.Select("/Articles/Article/Id")
     
    While nodes.MoveNext()
        MsgBox(nodes.Current.Value)
    End While

  19. #19
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Recherche du côté de XPath.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  20. #20
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 138
    Points : 37
    Points
    37
    Par défaut
    Merciiiiiii beaucouppppppppp

    ofet si je signale le probleme comme resolu
    et si je trouve un probleme relatif au meme sujet est ce que je dois creer une autre discussion ou juste le poser la?

    desolé mais je suis nouveau

    en tout les cas merci vous m'avez vraiment aider

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. recuperer les elements cochés
    Par zaineb.z dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2008, 19h52
  2. Réponses: 1
    Dernier message: 27/07/2006, 14h43
  3. [ASP][DOM] Récupérer les éléments d'un XML
    Par Tikate dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 03/05/2006, 11h51
  4. Récupérer les élements d'une structure ...
    Par Franck.H dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 17/10/2005, 15h48
  5. [VB6] [FileListBox] Récupérer les éléments sélectionnés
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/10/2002, 09h11

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