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

VB.NET Discussion :

Extraction de données à partir d'un fichier Xml [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut Extraction de données à partir d'un fichier Xml
    Bonjour !

    Ne trouvant pas mon bonheur après moultes recherches, je me tourne vers vous en espérant trouver la solution à mon problème qui m'empêche d'avancer depuis presque une journée.

    Voilà, comme le titre l'indique, je souhaites récupérer des données à partir d'un fichier Xml (créé à partir d'un dxdiag). Voici le début du fichier Xml (les tirets sont justes pour mieux voir 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
    <DxDiag>
    --<SystemInformation>
    ----<Time>9/18/2014, 10:48:49</Time>
    ----<MachineName>GLADIATOR</MachineName>
    ----<OperatingSystem>
    ------Windows 7 Professionnel 64-bit
    ----</OperatingSystem>
    ----<Language>French (Regional Setting: French)</Language>
    ----<SystemManufacturer>To Be Filled By O.E.M.</SystemManufacturer>
    ----<SystemModel>To Be Filled By O.E.M.</SystemModel>
    ----<BIOS>Default System BIOS</BIOS>
    ----<Processor>
    ------AMD Phenom(tm) II X4 965 Processor (4 CPUs), ~3.4GHz
    ----</Processor>
    Donc mon problème est le suivant, j'aimerai par exemple pouvoir afficher dynamiquement (au chargement de ma Form) dans un label le contenu du noeud "Processor", à savoir "AMD Phenom(tm) II X4 965 Processor (4 CPUs), ~3.4GHz".

    Voilà, je ne sais pas si c'est simple ou compliqué à faire, mais en tout cas je ne trouve pas de solution concrète. A savoir qu'un fichier MyDXdiag.xml est créé à la racine de C:, et c'est de là que sont tirées les informations à afficher.

    Merci de bien vouloir essayer de m'aider !

    A bientôt

    --
    Shennong

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    Recherche du côté de la deserialization !
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    La beauté des langages Microsoft pour ma part est son magnifique support et forum d'aide
    la plupart des problèmes peuvent être résolut avec une recherche google en mettant le mot clé "msdn" avant t'as recherche

    doc xml : http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx
    lien qui t'intéresse : http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx

  4. #4
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    OK merci Ranzoken, mais ce genre de réponse inutile ne m'aide pas du tout. Ce que je voulais dire par "après moultes recherches" c'est : "j'ai cherché sur google, msdn et tutti quanti", mais je ne comprends pas comment utiliser les données trouvées ça et là pour effectuer le travail que je souhaite faire sur mon fichier Xml. Je ne suis pas expert en VB et je comprends certains points, mais pour arriver à se positionner sur un noeud et chercher un élément précis, puis extraire son contenu, je n'y parviens pas. Toutes ces méthodes et autres me sont obscures, les codes trouvés sur le net sont complexes pour moi aujourd'hui. Et je n'utilise jamais de code trouvé sur le net sans le comprendre avant, afin de pouvoir le réutiliser ultérieurement.

    Ainsi, j'aimerai que l'on me donne un exemple dans mon cas précis que je puisse comprendre comment cela fonctionne à partir de quelque chose de concret. Car me balancer l'aide msdn ne sert à rien, j'y ai déjà jeté un coup d'oeil. Si tu ne peux pas m'aider, je suis sûr que d'autres posts seront à ta portée. Je galère depuis plusieurs heures sur ce problème et j'ai vraiment besoin d'aide, pas de personnes qui aiment à exprimer des évidences.

    Mctwist69, est-ce que tu peux m'expliquer ce que tu veux dire par "deserialization" ? à quoi cela correspond-t-il ?

    Merci.

    --
    Shennong

  5. #5
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    Désoler pour ce malentendu, pour ma part la msdn me suffit même pour apprendre
    alors je vais essayer d'expliquer alors:
    - la Sérialisation est le fait d'enregistrer des données dans un fichier tier comme par exemple les fichier binaire, les fichiers csv, ou bien même les fichier XML, ce principe est d'enregistrer les données (variable de ton code) dans ce fichier et ce de façon structuré
    - et donc la Dé-sérialisation est le principe inverse on récupere notre fichier pour en extraire les données puis les réutilisé dans notre code

    !!! le principe de sérialisation et déserialisation est du code à risque donc ne pas oublier le try catch

    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 xmldoc As XmlDocument = New XmlDocument
    Dim element As XmlNodeList
     
     Try
                ' ton load permet d'ouvrir ton fichier
                xmldoc.Load(System.AppDomain.CurrentDomain.BaseDirectory & "nomDeTonFicher.xml")
                ' GetElementsByTagName permet de récupérer tout les noeuds que l'on souhaite
                ' tu recuperai une liste contenant tout tes element qui sont dans systemeInformation
                element = xmldoc.DocumentElement.GetElementsByTagName("SystemInformation")
     
                Dim noeud As XmlNode
                dans le cas ou tu a plusieurs noeud on boucle pour trouvé le bon
                For Each noeud In element
                        ' pour tester si on a bien Procesor
                        If noeud.LocalName = "Processor" Then
                                ' on recupere la ligne Processor
                                JeRecupereMaLigne = noeud.InnerText
                        endif
                Next
     
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Ou alors... une méthode un peu plus longue à mettre en place, mais plus propre à mon goût :

    1) Tu te crées une classe, avec les exactes propriétés de ton fichier XML
    2) Tu rends cette classe serializable (avec ce même mot clé)
    3) du coup du peux faire MonDoc.Deserialise("Chemin de ton fichier")
    4) Et hop, ton objet contient toutes les infos de ton fichiers....
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  7. #7
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Super ! merci beaucoup ! là c'est de la vraie aide comme je l'attendais ! Merci Ranzoken pour ce bout de code explicatif. Je vais de ce pas aller le tester et voir ce que ça donne. Je comprends mieux le principe maintenant. Y a juste un dernier point que je ne comprend pas totalement, pourquoi doit-on déclarer un "noeud" et un "noeudEnd" ? On doit lui spécifier que la balise de début est ... la même que celle de fin ?

    Mctwist69 merci pour ton idée, pour le moment, vu que c'est celle de Ranzoken la plus claire, je vais la tester en premier lieu. Par contre, tu veux dire qu'avec ta méthode, on "enregistre" la structure uniquement du fichier xml, après si le dxdiag est créé à partir d'autres pc, la structure restant la même (enfin j'espère), on pourra récupérer les données de la même façon partout ? c'est bien ça ?

    Merci encore à tous les deux pour votre aide. J'étais un peu énervé hier et je m'en excuse, mais avec ce problème qui me prends un temps énorme, ma deadline approche à grand pas.

    A bientôt messieurs.

    --
    Shennong

  8. #8
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Arf, petit soucis que j'ai pas remarqué en lisant le code, la variable NoeudEnd n'est pas utilisée, et je vois pas où la mettre, comment cela fonctionne-t-il ?

    Merci.

    --
    Shennong

  9. #9
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    désoler ma faute, noeudend est un noeud enfant de noeud c'était pour récupérer une premiere balise puis tout ces enfant
    tu n'a pas besoin de tant soucier ici, elle n'est pas utilisé

    ps: supprimé du code
    mais comme la dit mactwist69 essaie de te faire une classe

  10. #10
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Mctwist69 merci pour ton idée, pour le moment, vu que c'est celle de Ranzoken la plus claire, je vais la tester en premier lieu. Par contre, tu veux dire qu'avec ta méthode, on "enregistre" la structure uniquement du fichier xml, après si le dxdiag est créé à partir d'autres pc, la structure restant la même (enfin j'espère), on pourra récupérer les données de la même façon partout ? c'est bien ça ?
    Si tu veux... tu créees une classes qui correspond à la structure du fichier XML.
    Ca permet de créer un objet (du type de cette classe) et tu peux en faire deux choses :

    - Soit tu crées l'objet vide, tu mets des données dedans... Et en une ligne de commande, tu peux générer un fichier xml, qui aura cette même structure + les données qui étaient contenu dans l'objet.

    - Inversement, tu peux vouloir lire le fichier xml, tu crées un objet vide, et avec une ligne de commande, tu remplis l'objet avec les données qui étaient contenu dans le fichier.

    Tu n'as pas a naviguer entre les noeuds du fichier... il le fait tout seul, puisque les structures sont les mêmes.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    La lecture nœud à nœud voila un truc très archaïque qui n'a plus lieu d'être à part peut être pour les gros fichiers qu'on ne peut pas déserialiser complètement en une fois.
    Voila un tuto qui parle de la désérialisation qu'évoquais mactwist69 : http://support.microsoft.com/kb/316730/fr

    Ce qui est génial c'est que tu peux ne taper que 5 lignes de code pour désérialiser ton objet vu que t'as un outil avec visual studio qui peut te générer tes classes à partir d'un fichier XML:
    http://thesoftwarearchitect.com/gene...lass-xml-file/

    Edit: Je viens de faire le test il me génère une classe de 3000 lignes , donc vaut mieux passer par l'outils xsd que de taper les classes à la main.

  12. #12
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Personnellement, et même si je n'ai rien contre l'approche sérialisation (qui est très complète quand on en a besoin) , je ne comprends pas pourquoi on évoque si peu souvent les classes XDocument et XElement (bref l'espace de noms System.Xml.Linq) surtout en VB.Net où on a quand même a disposition les Xml Literals (à moins d'un impératif spécifique au niveau de la version du framework qu'on utilise)

    Ainsi dans le cas où on veut récupérer la valeur du premier Processor du fichier il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim elt = XElement.Load("chemin du fichier")
    Console.WriteLine(elt...<Processor>.Value)
    et si on voulait afficher tous ceux contenus dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim elt = XElement.Load("chemin du fichier")
    For Each proc In elt...<Processor>
        Console.WriteLine(proc.Value)
    Next
    À voir ensuite quel type d'approche est à priviligier selon ce qu'il est nécessaire de faire dans le projet en question.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  13. #13
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Et voilà, ça y est ça marche !

    Je suis donc parti de ton code Ranzoken, j'ai juste dû chercher pour le noeudEnf, mais j'ai fini par trouver. Car apparemment le problème avec ton code c'est que tu reste dans le noeud parent défini, du coup il ne passe pas dans processeur. En déclarant SystemInformation comme noeud parent puis on recherche Processor en noeud enfant, cela fonctionne parfaitement.

    Voici le bout de code cela pourra peut-être intéresser quelqu'un dans le futur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim XmlDoc As XmlDocument = New XmlDocument()
            XmlDoc.Load("CHEMIN_DU_FICHIER_XML")
     
            Dim element As XmlNodeList
            element = XmlDoc.DocumentElement.GetElementsByTagName("NOEUD_PARENT")
     
            For Each noeud In element
                For Each noeudEnf In noeud.ChildNodes
                    If noeudEnf.LocalName = "NOEUD_ENFANT" Then
                        Label1.Text = noeudEnf.InnerText
                    End If
                Next
            Next
    Dans l'exemple, le noeud parent correspond donc au noeud situé juste en amont du noeud enfant duquel on souhaite extraire les données. Le noeud enfant est, quant à lui, le noeud duquel on veut extraire les données. Donc pour moi, je devais placer en noeud parent "SystemInformation" et en noeud enfant "Processor", pour pouvoir récupérer au final dans mon label les données concernant le processeur "AMD FX-8300 BE ... bla bla bla".

    Voilà, encore une fois merci beaucoup pour l'aide. Comme chaque fois que je pose ici une question, je repars avec des connaissances supplémentaires et la réponse, c'est nickel !

    Comme quoi, se poser des défis ça permet d'avancer et d'apprendre un langage ! je n'étais pas obligé de passer par un dxdiag pour trouver les infos du processeur, etc ... comme dans une précédente appli, j'aurais très bien pu utiliser la base de registre, cela fonctionne tout aussi bien et c'est beaucoup plus facile. Mais je me suis posé le challenge d'utiliser un fichier xml comme source ... bah je suis pas déçu, j'ai galéré mais finalement ça marche, et grâce à vous aussi.

    Merci encore. À bientôt !

    --
    Shennong

  14. #14
    Membre habitué Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Points : 135
    Points
    135
    Par défaut
    Salut ... "désir" lol

    Merci pour les infos, je vais jeter un coup d'oeil à ce que tu propose. Je ne sais pas si j'arriverai à utiliser ce principe, mais par curiosité je vais me pencher là-dessus.

    Cordialement-

    --
    Shennong


    P.S : je classe comme résolu !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/12/2009, 18h03
  2. [MySQL] Création base de données à partir d'un fichier XML
    Par kaya57200 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/12/2009, 22h58
  3. Extraction d'informations à partir d'un fichier xml
    Par ayoubnour dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2009, 08h54
  4. exporter des données à partir d'un fichier XML
    Par wafaingstat dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 10/01/2009, 16h51
  5. extraction de données à partir d'un fichier text ou xml
    Par bigplayer dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2007, 17h13

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