Bonjour,
Comme le titre l'indique, comment pourrais-je faire pour exploiter les données extraites d'un fichier XML pour les stocké dans un tableau ou DataSet?
Quelqu'un a une idée?
Merci
Version imprimable
Bonjour,
Comme le titre l'indique, comment pourrais-je faire pour exploiter les données extraites d'un fichier XML pour les stocké dans un tableau ou DataSet?
Quelqu'un a une idée?
Merci
je suppose que tu charge tes données XML dans un XMLDocument. a l'aide d'une instruction Xpath tu récupère les nœuds dans un XMLNodeList ensuite tu boucle sur le XMLNodeList, tu récupère les données et tu charge dans ton tableau ou DataSet.
@++ ;)
Je récupère mes valeurs ( des noeuds ) avec le code suivant :
Premièrement, c'est que je n'arrive pas à tout parcourir les noeuds, ya des noeuds vers la fin du fichier XML je n'ai plus de messages box, on dirait la fin du fichier même si c pas le cas ( normalement en Xpath .//* me donnera tout les noeud sans distinction non ? )Code:
1
2
3
4
5
6
7
8
9 Dim xpathDoc As XPathDocument Dim xNavigator As XPathNavigator Dim xNodeIterator As XPathNodeIterator xpathDoc = New XPathDocument("c:\Test_1.xml") xNavigator = xpathDoc.CreateNavigator() xNodeIterator = xNavigator.Select(".//*") While (xNodeIterator.MoveNext()) MessageBox.Show(xNodeIterator.Current.Name + " : " + xNodeIterator.Current.Value) End While
Deuxièment, pour récupèrer ça dans un tableau? je dois récupérer les valeurs dans une variable puis un tableau ? je ne vois pas bien
Merci
Bonsoir, je dis peut-être une bêtise mais pourquoi ne pas essayer de récupérer les valeurs avec une requête linq ?
Salut Jean-Michel Ormes,
Merci, oui pourquoi pas! tu peux m'eguiller plus?
Salut,
Une requête linq fonctionne comme une requête SQL. Au vu de ton code, je dirais que tu peux essayer ça :
Ensuite, tu peux réutiliser la variable requête dans un foreach pour remplir ton tableau en fonction de tes noeuds.Code:
1
2
3
4 var requete = from s in xpathDoc.Descendants("test") // Exemple de requête select s;
PS : Il faut que tu rajoute des références à ton code (System; System.Linq; System.Xml.Linq;)
tssi555
en Xpath .//* retourne tout les noeuds sans distinction en partant du contexte actuelle donc s'il y'a des noeuds qui ne font pas partir de ce contexte c'est normal que tu ne puisse pas lire ceux-ci.
Jean-Michel Ormes
A ce que je sache le XpathDocument n'a pas une méthode Descendants()
@++ ;)
Oui exact lilroma. Mais avec un XElement ça marche il me semble.
Merci à vous deux,
Ce que je veux exactement, c'est de pouvoir lire mon fichier XML ( j'arrive à le parcourir ) et stocker les valeurs (en faisant la distinction entre tout les noeuds) soit dans un tableau soit dans un data set puis les afficher dans un datagridview, cette derniere solution sera l'idéale.
Fait voir le code que tu utilise pour parcourir ton fichier XML
@++ ;)
Code:
1
2
3
4
5
6
7
8
9
10 Dim xpathDoc As XPathDocument Dim xNavigator As XPathNavigator Dim xNodeIterator As XPathNodeIterator xpathDoc = New XPathDocument("c:\test_1.xml") xNavigator = xpathDoc.CreateNavigator() xNodeIterator = xNavigator.Select(".//*") While (xNodeIterator.MoveNext()) MessageBox.Show(xNodeIterator.Current.Name + " : " + xNodeIterator.Current.Value) End While
Encore un autre pas en avant de fait,
maintenant, j'arrive à charger le DataSet par les données du fichiers XML puis afficher tout ca dans un DataGridView, le problème c'est que j'ai que le premier contexte avec ses Nodes-Childs et donc une seule ligne dans le datagridview :?
Je veux parcourir tout le fichier xml et avoir tout les données pour les afficher dans le gridview et pas seulement une partie.
Mon code est le suivant :
MerciCode:
1
2
3
4
5
6
7
8 Dim xmlDatadoc As New XmlDataDocument() xmlDatadoc.DataSet.ReadXml("C:\test_1.xml") Dim ds As New DataSet("ds_LoadXML") ds = xmlDatadoc.DataSet frmLoadXML.DataGridView1.DataSource = ds.DefaultViewManager frmLoadXML.DataGridView1.DataMember = "import_batch" frmLoadXML.Show()
Dans ce cas tu ne doit pas passer par le Binding, puisque chaque contexte peut avoir sa propre structure XML c'est pour cella que c'est un seul contexte (par défaut le contexte courant) qui est charger dans le DGV.
Et pour la lecture dans l'instruction Xpath je crois tu sera obliger a chaque de définir le contexte.
@++ ;)
Merci, mais si tu veux bien me donner un exemple concret suite à mon code pour les deux cas que tu viens d'expliquer.
Les deux solutions m'interesses, mais comme c ma première manipulation je ne vois pas bien comment faire.
Ok fait voir la structure de ton fichier XML pour que je puisse l'adapter a ton cas.
@++;)
Code:
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<?xml version="1.0" ?> - <ASREQUEST_CIC_ASC> - <AS_REQUEST> - <ASREQUEST_INFO> <COMPANY>ZZZZ</COMPANY> <JOB_NO /> <ASC_CODE /> - <PRODUCT> - <PRODUCTSHORT> <MODEL_CODE /> <SERIAL_NO /> <PURCHASE_DATE /> </PRODUCTSHORT> - <SYMPTOM> <SYMPTOM1_DESC /> <SYMPTOM2_DESC /> <SYMPTOM3_DESC /> </SYMPTOM> </PRODUCT> - <SERVICE> <SERVICE_TYPE /> <SERVICE_TYPE_DESC /> </SERVICE> <IN_OUT_WARRANTY /> <REQUEST_DATE /> <REQUEST_TIME /> <REPAIR_ETD_DATE /> <REPAIR_ETD_TIME /> - <TRACKING> <TR_STATUS /> <TR_STATUS_DESC /> </TRACKING> - <TRREASON> <TR_REASON /> <TR_REASON_DESC /> </TRREASON> <INQUIRY_TEXT /> <REF_NO /> </ASREQUEST_INFO> - <CONSUMER_INFO> <BP_NO>EMPTY</BP_NO> - <CUSTNAME> <TITLE /> <FIRST_NAME /> <LAST_NAME /> </CUSTNAME> - <PHONE> <TEL_NUMBER1 /> <TEL_NUMBER2 /> <TEL_NUMBER3 /> <FAX_NUMBER /> <E_MAIL /> </PHONE> - <ADDRESS> <ADDRESS_NUMBER /> <COUNTRY /> <REGION /> <POST_CODE /> <CITY /> <STREET /> <HOUSE_NUMBER /> <ROOM_NUMBER /> <FLOOR /> </ADDRESS> </CONSUMER_INFO> - <DEALER_INFO> <BP_NO>EMPTY</BP_NO> - <CUSTNAME> <TITLE /> <FIRST_NAME /> <LAST_NAME /> </CUSTNAME> - <PHONE> <TEL_NUMBER1 /> <TEL_NUMBER2 /> <TEL_NUMBER3 /> <FAX_NUMBER /> <E_MAIL /> </PHONE> - <ADDRESS> <ADDRESS_NUMBER /> <COUNTRY /> <REGION /> <POST_CODE /> <CITY /> <STREET /> <HOUSE_NUMBER /> <ROOM_NUMBER /> <FLOOR /> </ADDRESS> </DEALER_INFO> </AS_REQUEST> </ASREQUEST_CIC_ASC>
Ce que tu a poster je ne voie qu'un seul contexte si ta plusieurs nœuds
Ce que tu va faire c'est ajouter une balise globalisante et le nœud ci-dessus serons des nœuds enfant. La tu va te retrouver avec un seul contexte et ainsi pouvoir charger toute tes données dans le DataSet et le DGV.Code:
1
2
3 <ASREQUEST_CIC_ASC> </ASREQUEST_CIC_ASC>
@++ ;)
Bah non!! pourquoi un seul contexte ?
Ya aussi :
Code:
1
2
3 <AS_REQUEST> </AS_REQUEST>
Code:
1
2
3 <PRODUCT> </PRODUCT>
Code:
1
2
3
4 <PRODUCTSHORT> </PRODUCTSHORT>
Code:
1
2 <SYMPTOM> </SYMPTOM>
Code:
1
2 <SERVICE> </SERVICE>
Code:
1
2 <TRACKING> </TRACKING>
Et bien tout les autres noeuds et noeuds-enfants contenus dans le fichier soulevé ci-dessus!Code:
1
2 .... ....
Tout ça entre :
Code:
1
2
3 <ASREQUEST_CIC_ASC> </ASREQUEST_CIC_ASC>
C'est juste ils ne contiennent pas de valeurs ou contiennent une chaine vide entre les balises c'est tout et pas qu'il y'a un seul contexte dans le fichier.
Bonjour,
Pour finir, je charge mes données XML dans un DataSet (et pas dans un simple tableau ) puis je les affiches dans un DataGridView, c'est plus pratique et plus facile de les exploiter par la suite.
Je donne le lien de la msdn au cas cela pourra aider quelqu'un ;)
http://msdn.microsoft.com/en-us/library/ekw4dh3f.aspx
Le contexte dans un fichiers Xml c'est la balise qui englobe toute les autres si en plus de de la balise
tu avais une autre balise englobante en dehors de celle la c'est a ce moment que tu pourrais parler de plusieurs contexte :)Code:
1
2
3 <ASREQUEST_CIC_ASC> </ASREQUEST_CIC_ASC>
:ccool:Citation:
Pour finir, je charge mes données XML dans un DataSet (et pas dans un simple tableau ) puis je les affiches dans un DataGridView, c'est plus pratique et plus facile de les exploiter par la suite.
@++ ;)
Ok, et alors si on veut avoir tout le contenu de données à partir d'un tel contexte sans devoir préciser les noeuds ou d'où va commencer l'affichage, c'est possible ça ? je parle des données et pas le schèma XSD
L'expression Xpath sera quelque chose du genre.
@++ ;)Citation:
.//*
Apparement le problème est loin d'être résolu :?
Le fichier XML donné comme exemple d'msdn ne reflète pas un cas complexe pour la lecture du fichier. en plus il faut à chaque fois fournir le nom du noeud pour afficher les noeuds-enfants.
Ta raison lilroma,
Et bah dans le cas où j'aurai plusieurs contextes par exemples, je veux les lires tous, je veux parser tout le XML et récupérer un lot de données en un seul coup.
Imaginons dans un fichier XML, par exemple aussi que j'ai le noeud "NumTel", NumTel est se répète pour le CLient, puis NumTel pour Le Revendeur, Puis NumTel est repris aussi pour Fournisseur, comment faire pour tout afficher en un seul coup avec differenciation que tel numéro est pour le client et tel numéro est pour le fournisseur même si les noms des balises sont les même.
Merci
Tout a fait soit tu met le . qui par défaut référence le contexte actuel qui l'élément racine du XML
Comme ta dit plus haut toute requete Xpath part d'un contexte sa suppose que si l'on en a plusiurs dans un fichier XML je crois bien que l'on soit obliger de faire plusieurs requete Xpath :oops:.
s'aurais été relativement simple si la structure de ton fichier pouvais être sur cette forme
la tu faire ce que tu veut.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <membres> <membre> <id>M1</id> <nom>toto</nom> <numtel>1237544</numtel> <type>client</type> ... <membre> <membre> <id>M2</id> <nom>riri</nom> <numtel>12435445</numtel> <type>revendeur</type> ... <membre> <membres>
pour mieux t'expliquer cette notion de contexte rapprochons ton fichier XML a une base de données a ce moment chaque contexte sera vue ici comme une table pour l'exemple ci haut l'on a la table membre qui contient la liste des membres si a la suite de ça y'avais une autre balise globalisant sa devais faire une autre table. hors en SQL si l'on veut sélectionner les données de plusieurs table en une seule requête le plus souvent il faut un élément de jointure. Ce qui n'est pas le cas en Xpath toi même tu vois qu'il nous faut plusieurs requête Xpath.
Si c'est toi qui créer les fichiers XML essaie de prendre pour exemple ce que j'ai poster pour évoluer dans ton programme dans le cas contraire j'aimerais pas être a ta place :aie:
@++ ;)
Personne ne veut être à ma place! :? t pas le seul à me le dire tu sais !
M'enfin, c'est pour dire que ce n'est pas moi qui creé les fichier XML, ils sont déjà faite et bien gourmends d'infos. je dois les récupérer à partir d'un serveur web distant sécurisé, les télécharger en local, puis les parser "par lot" ! :calim2: pour avoir une vue globalisante avec tout les données contenu dans le XML, par lot bien sûr :oops:
Dans ce cas tu est obliger d'aller au cas par cas pour exploiter les données du fichier XML sa pourrais faire beaucoup de code a écrire sinon courage :).
@++ ;)
Non c pas possible de faire cas par cas 8O! c inernal, tu peux pas imaginer la masse de fichiers XML (sans parler des données contenues dedans) téléchargés par jour ( à injecté via SQL dans la DB ) . il faut plutôt engager qq1 d'autre et inventer un nouveau job "Lecteur d'XML".