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 :

Parseur XML "intelligent"


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Parseur XML "intelligent"
    Bonjour

    Je n'ai peut etre rien compris a l'XML reader mais je ne vois pas ce qu'il apporte de fondamental par rapport a un bete streamreader !

    Mon fichier (ou flux) xml est composé d'elements de structure ci apres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      <trace>
        <type>71</type>
        <source>Seat Leon 16-XP-XJ</source>
        <time>2008-10-15T05:55:22.0</time>
        <coordinate>
          <latitude>51.79864</latitude>
          <longitude>4.55908</longitude>
        </coordinate>
        <mileage>33690079</mileage>
        <heading>102</heading>
        <speed>0</speed>
      </trace>
    J'avais naivement imagine que le XML reader m'aurait permis une lecture structurée

    Mais si j'ai bien compris les exemple que j'ai trouvé il faut lire morceau par morceau, quand le morceau est un éléments on retiens son nom, ensuite on espere lire un text qui est la valeur et on se débrouille avec les deux
    On est pas tres loin d'un bete parsage sequentiel de fichier texte !

    J'avais au minimum espéré que le XmlReader puisse donner une liste hierarchisée d'elements du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class Elem
    {
       object Name 
       object Value
    }
    J'ai loupé quelque chose ?
    Ou bien ce XmlReader est vraiment primitif ?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Le XmlReader offre une lecture de type curseur, c'est une bête lecture séquentielle. C'est adapté pour le traitement de gros fichiers XML, histoire de ne pas tout charger en mémoire. Maintenant si tu veux quelque chose de plus structuré, tu peux essayer avec une approche arbre (XmlDocument, XPathDocument pour de la lecture seule).

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Stormimonn

    Le XmlReader offre une lecture de type curseur, c'est une bête lecture séquentielle.
    TU me rassure !
    Je croyais avoir loupé qq chose d'u peu gros !

    Par contre a l'inverse (si j'ai toujours bien compris ) XmlDocument lit tout le fichier d'un coup ....

    Il n'existe pas de Reader Natif qui parse par elément complet ?

    Mais ce que je trouve quand meme un peu gros avec le XmlReader c'est qu'il n'y a pas d'association Name / Value et que là aussi il faut bricoler séquentiellement "a la main" !!

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par olibara Voir le message
    Par contre a l'inverse (si j'ai toujours bien compris ) XmlDocument lit tout le fichier d'un coup ....
    Oui, mais si le fichier à lire n'est pas monstrueux ça ne pose pas de problème je pense. Tu peux récupérer les éléments qui t'intéressent après. Et pour de la lecture seule il vaut mieux passer par XPathDocument, qui est optimisé à ce niveau (moins gourmand qu'un XmlDocument pour un même fichier XML).

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    J'ai été faire un tour du doté du XPathReader mais je ne parviens pas plus facilement a recuperer mes valeurs

    Je me suis donc retourné vers le XmlReader qui est de toute facon incontournable face a un stream !

    Aurais tu la bonté de me dire s'il n'y a pas de methode plus directe de faire ce que je fais !
    Ce serait en C, certainement pas !
    Mais en .NET Csharp je la sens mal !

    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
          reader = new XmlTextReader(doc);
     
          // Read the File
          string curName="";
          string Source = "";
          double Latitude;
          while (reader.Read())
          {
            XmlNodeType nodeType = reader.NodeType;
            switch (nodeType)
            {
              case XmlNodeType.Element:
                curName = reader.Name;
                break;
              case XmlNodeType.Text:
                if (curName.Equals("source"))
                {
                  Source = reader.Value;
                }
                else if (curName.Equals("latidude"))
                {
                  double.TryParse(reader.Value, out Latitude);
                }
                else if (// etc..)
                {
                   // etc...
                }
                break;
            }
          }

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par olibara Voir le message
    Je me suis donc retourné vers le XmlReader qui est de toute façon incontournable face a un stream !
    Tu peux construire un XPathDocument à partir d'un objet de type Stream. Maintenant ce n'est peut être pas ce que tu entends par "stream".

    Sinon, tu peux simplifier ton code ainsi
    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
    string source = "";
    double latitude = 0;
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                if (reader.Name == "source")
                {
                    source = reader.ReadElementContentAsString();
                }
                else if (reader.Name == "latitude")
                {
                    latitude = reader.ReadElementContentAsDouble();
                }
                break;
        }
    }
    Cela te suffira peut être

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/09/2007, 16h57

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