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

C# Discussion :

[.NET C# XML] Lecture, noeud par noeud, d'un fichier XML


Sujet :

C#

  1. #1
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut [.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 : 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>
    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 : 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();
    		}
    	}
    }
    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
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

  2. #2
    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
    Moi pour faire ce genre de choses, j'aime bien utiliser un XPathReader avec les requêtes XPath qui vont bien.
    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

  3. #3
    Membre habitué Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Points : 128
    Points
    128
    Par défaut Merci quand même
    Merci SaumonAgile, tout compte fait je m'en suis sorti avec des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    reader.ReadToFollowing("BALISE");
    //ou des
    reader.Read();
    //pour avancer pas à pas dans le fichier.
    Merci de ta réponse !
    @+
    Antoine
    "Je ne suis pas d'accord avec ce que vous dites, mais je me battrai jusqu'à la mort pour que vous ayez le droit de le dire." Voltaire

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/12/2010, 13h56
  2. Réponses: 6
    Dernier message: 18/09/2009, 09h35
  3. [DOM] importer un noeud d'un fichier xml et le coller dans un autre fichier
    Par iznogoud36 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/06/2006, 12h55
  4. Réponses: 6
    Dernier message: 06/03/2006, 13h38

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