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 :

Lecture rapide d'un fichier XML


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut Lecture rapide d'un fichier XML
    Bonjour tout le monde,

    Je dispose d'un fichier XML assez énorme (1.5 Mo) et je voudrais savoir quelles sont les pistes à suivre pour le lire le plus rapidement possible ? par exemple, quelle méthode utiliser pour ne lire qu'un type de noeud ?

  2. #2
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 218
    Points : 247
    Points
    247
    Par défaut
    Plusieurs méthodes dont celle-ci :

    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
     XmlDocument monXml = new XmlDocument();
                try
                {
                    monXml.Load("test01.xml");
                    Console.WriteLine("XML Chargé");
                }
     
                catch (Exception ex)
                {
                    Console.WriteLine("erreur {0}", ex.Message);
                }
                XmlNode objNode;
                XmlNode root = monXml.DocumentElement;
     
                objNode = root.SelectSingleNode("//node[@value='03']");

  3. #3
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Akanath Voir le message
    Plusieurs méthodes dont celle-ci :

    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
     XmlDocument monXml = new XmlDocument();
                try
                {
                    monXml.Load("test01.xml");
                    Console.WriteLine("XML Chargé");
                }
     
                catch (Exception ex)
                {
                    Console.WriteLine("erreur {0}", ex.Message);
                }
                XmlNode objNode;
                XmlNode root = monXml.DocumentElement;
     
                objNode = root.SelectSingleNode("//node[@value='03']");
    Merci pour ta réponse rapide ! peux tu m'en dire plus sur cette partie ("//node[@value='03']"); ?

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538

  5. #5
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Ok, merci à vous deux

  6. #6
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Re bonjour tout le monde,

    J'ai besoin de vos lumières:
    Je travaille toujours avec le même fichier xml dont la structure est en gros

    Département
    ---->Name
    ---->Nombre employés
    ---->Projet
    ---->Chef d'équipe
    Et bcp, bcp de départements, et plusieurs départements par projet.

    Au final, je voudrais récupérer quelque chose, un tableau, une liste, je ne sais pas encore qui ressemble à ça;

    Projet --> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    ---------> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    ---------> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    Projet --> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    ---------> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    ---------> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    Projet --> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    ---------> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    ---------> Département --> Name
    -------------------------> Nombre employés
    -------------------------> Chef d'équipe
    Etc...pour l'instant je compte fonctionner ainsi: à chaque fois que je rencontre un noeud projet, je récupère les noeuds enfant du noeud parent,. Si le projet n'existe pas dans ma liste, faire un Add. Sinon, rajouter au projet le département. Peut-être y a t-il un meilleur algo pour arriver à ce résultat, sachant qu'il y a énormément, énormément de données à traiter (le traitement doit être rapide) ?

    Aussi, je ne suis pas certain de la meilleure structure à utiliser pour récupérer ces données, car il peut y avoir plusieurs profondeurs en fonction du département, par exemple:

    Projet --> Département --> Nombre d'employés --> Noms des employés --> Moyenne d'âge
    ---------> Département --> Nombre d'employés --> Age des employés
    J'espère que ma question est claire

  7. #7
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par GriffinK Voir le message
    Je dispose d'un fichier XML assez énorme (1.5 Mo) et je voudrais savoir quelles sont les pistes à suivre pour le lire le plus rapidement possible ? par exemple, quelle méthode utiliser pour ne lire qu'un type de noeud ?
    Si ta contrainte absolue est la vitesse de lecture, tu devrais utiliser un XmlTextReader, qui est beaucoup plus rapide qu'un XmlDocument.

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    salut

    tu peux aussi utiliser :

    xsd.exe (outil du framework)

    ainsi tu auras :

    tonXml.Xml ==> tonXml.xsd ==> TonXML.cs

    En 10 secondes, tu auras la classe qui serait remplie par une désérialisation xml de ton code (classe XmlSerializer).

    Et après, tu peux travailler sur les données, plus que sur comment les récupérer...

    Enfin, perso, je ne me pose plus la question.. Fichier xml == Reflexe automatique XSD, génération de classes automatiques et après, travail sur le fonctionnel

    Mais bon... c une façon de travailler.. rapide et efficace.. mais pas unique !

  9. #9
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    tu peux aussi utiliser :

    xsd.exe (outil du framework)

    ainsi tu auras :

    tonXml.Xml ==> tonXml.xsd ==> TonXML.cs

    En 10 secondes, tu auras la classe qui serait remplie par une désérialisation xml de ton code (classe XmlSerializer).

    Et après, tu peux travailler sur les données, plus que sur comment les récupérer...

    Enfin, perso, je ne me pose plus la question.. Fichier xml == Reflexe automatique XSD, génération de classes automatiques et après, travail sur le fonctionnel

    Mais bon... c une façon de travailler.. rapide et efficace.. mais pas unique !
    Mouaipe... j'en suis revenu des classes générées par XSD.exe, parce que la désérialisation XML est extrêmement lente. Il me prenait plus de 500ms pour pour ouvrir et parser un fichier XML de moins de 100 lignes.

  10. #10
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    tu peux aussi utiliser :

    xsd.exe (outil du framework)

    ainsi tu auras :

    tonXml.Xml ==> tonXml.xsd ==> TonXML.cs

    En 10 secondes, tu auras la classe qui serait remplie par une désérialisation xml de ton code (classe XmlSerializer).

    Et après, tu peux travailler sur les données, plus que sur comment les récupérer...

    Enfin, perso, je ne me pose plus la question.. Fichier xml == Reflexe automatique XSD, génération de classes automatiques et après, travail sur le fonctionnel

    Mais bon... c une façon de travailler.. rapide et efficace.. mais pas unique !
    Je vais regarder de ce côté ! merci pour ta réponse, et merci à Gold Bug aussi

    Toulouse me manque...

  11. #11
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,
    Citation Envoyé par GriffinK Voir le message
    Je dispose d'un fichier XML assez énorme (1.5 Mo)
    C'est tout petit ça. Mes programmes doivent en traiter de 60 ou 80Mo.
    Citation Envoyé par GriffinK Voir le message
    et je voudrais savoir quelles sont les pistes à suivre pour le lire le plus rapidement possible ? par exemple, quelle méthode utiliser pour ne lire qu'un type de noeud ?
    Certainement pas un XmlDocument!! Le XmlDoc charge la totalité du fichier en mémoire avant de le traiter... Pour un petit fichier de 1.5Mo c'est sans douleur, pour les autres bonjour!
    Il n'y a rien de plus rapide qu'un XmlReader.
    Enfin, perso, je ne me pose plus la question.. Fichier xml == Reflexe automatique XSD, génération de classes automatiques et après, travail sur le fonctionnel
    Tous les fichiers Xml ne passent pas avec XSD. De plus il n'est pas forcement utile de générer des classes monstrueuses alors qu'on a juste besoin de lire un élément et deux attributs.
    A+

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/02/2011, 15h26
  2. [XPATH 1.0] Temps de lecture d'un "gros" fichier XML
    Par Ikki_2504 dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 14/01/2011, 18h27
  3. [XML] Lecture d'assez gros fichiers XML
    Par jeronimo83 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/02/2010, 18h26
  4. Lecture/Ecriture d'un fichier XML
    Par andlio dans le forum Windows
    Réponses: 2
    Dernier message: 18/01/2007, 20h15

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