Bonjour à toutes et à tous !
Tout est dans le titre ! Si j'ai bien tout compris au XML un noeud représente l'ensemble {Balise Ouvrante, Contenu éventuel, Balise Fermante}.
Etant donné cette structure qu'offre le XML, je pensais qu'il eu été assez simple de lire de manière séquentiel, le contenu de chaque balise.
J'ai un fichier XML qui se présente de la sorte (c'est la récupération d'une base de données Oracle Spatial mais peu importe...) :
Evidemment je vous ai mis qu'une seule <ROW> mais il y en a aux alentours du milion :p
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 <?xml version="1.0" standalone="yes"?> <ROWSET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ROW> <GEOM> <SDO_GTYPE>2002</SDO_GTYPE> <SDO_SRID>41014</SDO_SRID> <SDO_ELEM_INFO> <NUMBER>1</NUMBER> <NUMBER>2</NUMBER> <NUMBER>1</NUMBER> </SDO_ELEM_INFO> <SDO_ORDINATES> <NUMBER>309516.700468</NUMBER> <NUMBER>2242301.500063</NUMBER> <NUMBER>309540.530468</NUMBER> <NUMBER>2242258.080063</NUMBER> <NUMBER>309572.600468</NUMBER> <NUMBER>2242199.870063</NUMBER> </SDO_ORDINATES> </GEOM> </ROW> [...] </ROWSET>
Mon code pour tout récupérer est le suivant :
Il s'avère qu'il me récupère tout sauf le tableau Ordinates.
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 private String g_type; private String srid; private Int32[] elem_info = new Int32[3]; private List<Double> ordinates = new List<Double>(); //Je vous passe la déclaration du reader (objet de type XmlTextReader) : il fonctionne car j'ai écrit le fichier XML pour vérifier ! while (reader.Read()) { if (reader.LocalName == "ROW") { reader.ReadToFollowing("GEOM"); //On démarre la lecture d'une nouvelle geometrie //Récupération du Gtype reader.ReadToFollowing("SDO_GTYPE"); g_type = reader.ReadString(); //Récupération du Srid reader.ReadToFollowing("SDO_SRID"); srid = reader.ReadString(); //Récupération du tableau eleminfo (toujours 3 valeurs) reader.ReadToFollowing("NUMBER"); elem_info[0] = System.Convert.ToInt32(reader.ReadString()); reader.ReadToFollowing("NUMBER"); elem_info[1] = System.Convert.ToInt32(reader.ReadString()); reader.ReadToFollowing("NUMBER"); elem_info[2] = System.Convert.ToInt32(reader.ReadString()); //Récupération du tableau Ordinates (nombre de valeurs aléatoire reader.ReadToFollowing("ORDINATES"); reader.ReadToFollowing("NUMBER"); while (reader.LocalName == "NUMBER") { ordinates.Add(System.Convert.ToDouble(reader.ReadString())); reader.Read(); } } }
Ce que je voudrais ? :
C'est avoir une méthode simple permettant de lire le contenu d'une balise et de passer à la suivante, tester son nom (G_TYPE, NUMBER, SRID...), lire la valeur en fonction de cela et passer à la balise suivante...
C'est tout con mais je ne trouve pas les méthodes permettant de faire cela dans l'objet XmlTestReader !
Merci de vos réponses et à très vite !!!
++
Antoine
Partager