[.NET C# XML] Lecture, noeud par noeud, d'un fichier XML
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...) :
Code:
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> |
Evidemment je vous ai mis qu'une seule <ROW> mais il y en a aux alentours du milion :p
Mon code pour tout récupérer est le suivant :
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
|
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();
}
}
} |
Il s'avère qu'il me récupère tout sauf le tableau Ordinates.
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