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 :

Parser fichier XML


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut Parser fichier XML
    Bonjour,

    Je développe une application en C# qui permet de récupérer le temps de communication d'une personne sur un mois donné par rapport à son numéro de téléphone.
    Le soucis est que mon application a l'air de fonctionner SAUF sur UN SEUL fichier ! "Une exception non gérée du type 'System.NullReferenceException' s'est produite dans Parse_Ticket_Collector.exe"

    Ma fonction :

    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
     //on charge le fichier:
                var doc = XDocument.Load(userSelectedFilePath);
     
                string month = dateTimePicker1.Value.ToString("yyyy-MM");
                string format = "yyyy-MM";
                var value = DateTime.ParseExact(month, format, CultureInfo.InvariantCulture, DateTimeStyles.None);
                label4.Text = value.ToString("yyyy-MM"); //Test format date
     
                //on fait une requete linq sur le fichier:
                // on sélectionne tous les appels de l'utilisateur renseigner dans la textBox et le datePicker
     
                var number = from call in doc.Root.Elements("CallAccounting")
                             where call.Element("ChargedUserID").Value == textBox2.Text && DateTime.Parse(call.Element("Date").Value).ToString("yyyy-MM") == dateTimePicker1.Value.ToString("yyyy-MM")
                             select call;
     
                var moyenne = number.Sum(call => TimeSpan.Parse(call.Element("CallDuration").Value).TotalSeconds);
                TimeSpan t = TimeSpan.FromSeconds(moyenne);
                string answer = string.Format("{0:D2}h:{1:D2}m:{2:D2}s",
                       t.Hours,
                       t.Minutes,
                       t.Seconds);
                listView1.Items.Add("Temps de communication : " + answer);
    J'ai testé le fichier sur xml validator et apparemment il n'y a pas de problème...

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Salut,

    Il nous manque la ligne qui a provoquée ton erreur.

    Mais a vu de nez, c'est un nœud XML qui n'existe pas dans ton fichier... Et donc quand tu fais le ".Value" d'un objet qui n'existe pas --> NullReferenceException

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Ah oui désolé j'ai oublié de préciser la ligne !

    where call.Element("ChargedUserID").Value == textBox2.Text && DateTime.Parse(call.Element("Date").Value).ToString("yyyy-MM") == dateTimePicker1.Value.ToString("yyyy-MM")

    C'est bizarre que ce noeud n'existe pas vu que les fichiers xml sont générés par le server PABX, donc ils sont identiques mais il n'y a qu'un seul fichier qui ne veut pas se laisser parser

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Je pense que tu es bon pour une petite session de debug : lance ton programme en debug et inspecte chacune des valeurs pouvant être null : call.Element("ChargedUserID") et call.Element("Date").

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Hmm oui, lancer l'application en debug pas de soucis mais comment faire pour inspecter les valeurs null ?! (J'utilise visual studio)

  6. #6
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Alors pour raccourcir un peu le debug :
    Voici une requête qui te renverra les lignes qui posent problèmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                var getProbleme = from call in doc.Root.Elements("CallAccounting")
                             where !call.Elements("ChargedUserID").Any() || !call.Elements("Date").Any()
                             select new
                             {
                                 IsChargedUserIDNull = !call.Elements("ChargedUserID").Any(),
                                 IsDateNull = !call.Elements("Date").Any()
                             };

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    L'erreur que ta variable m'a retourné : System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,<>f__AnonymousType0`2[System.Boolean,System.Boolean]]

    (Merci pour ton aide )

  8. #8
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Je ne sais pas trop.

    Voici mon exemple :

    XML :
    Code xml : 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
    <?xml version="1.0" encoding="utf-8" ?>
    <personnes>
      <personne>
        <id>1</id>
        <name>Test1</name>
        <type>1</type>
      </personne>
      <personne>
        <id>2</id>
        <type>1</type>
      </personne>
      <personne>
        <id>3</id>
        <name>Test3</name>
      </personne>
    </personnes>

    Code :
    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
                var doc = XDocument.Load("Personnes.xml");
     
                var problemes = from call in doc.Descendants("personne")
                             where !call.Elements("name").Any() || !call.Elements("type").Any()
                             select new
                             {
                                 Id = call.Element("id").Value,
                                 IsNameNull = !call.Elements("name").Any(),
                                 IsTypeNull = !call.Elements("type").Any()
                             };
     
                foreach (var probleme in problemes)
                {
                    Console.WriteLine("Id : {0} , IsNameNull : {1}, IsTypeNull : {2}",
                        probleme.Id, probleme.IsNameNull.ToString(), probleme.IsTypeNull.ToString());
                }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                //Id : 2 , IsNameNull : True, IsTypeNull : False
                //Id : 3 , IsNameNull : False, IsTypeNull : True
    A toi de l'adapter

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Je pense l'avoir adapté ! Je récupère donc : IsChargedUserIDNull : True, IsDateNull : False

  10. #10
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Citation Envoyé par Kisper Voir le message
    Je pense l'avoir adapté ! Je récupère donc : IsChargedUserIDNull : True, IsDateNull : False
    Ce qui veut bien dire qu'il y a un problème dans ton fichier
    Pour trouver l'élément problématique, j’espère que tu as un champs "unique" (clé) dans ton arborescence XML sinon cela va être plus compliqué !

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Malheureusement étant un fichier xml généré par un serveur pabx (serveur téléphonique qui enregistre tous les appels dans du xml) je me retrouve avec 125.000 lignes et donc pour retrouver l'erreur... Je pense que ça risque d'être difficile !

    Cependant, comment puis-je parser la date récupéré dans ma requête linq, pour ensuite comparer plus "facilement" avec mon dateTimePicker ?

    Du style dateLinq.Month == dateTimePicker.Value.Month && dateLinq.Year == dateTimePicker.Value.Year;

  12. #12
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Citation Envoyé par Kisper Voir le message
    Cependant, comment puis-je parser la date récupéré dans ma requête linq, pour ensuite comparer plus "facilement" avec mon dateTimePicker ?

    Du style dateLinq.Month == dateTimePicker.Value.Month && dateLinq.Year == dateTimePicker.Value.Year;
    C'est une autre question...
    Je ferai presque comme tu as fais par contre je garderai l'avantage du type "DateTime"

    Je ferais un méthode d'extension pour les DateTime qui compare deux dates sur l'année et le mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public static class DateExtension
        {
            public static bool IsDateMonthYearEqual(this DateTime dateIn, DateTime dateCompare)
            {
                return dateIn.Month == dateCompare.Month && dateIn.Year == dateCompare.Year;
            }
     
        }
    Et voici un code pour l'utiliser :
    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
                var dates = new List<DateTime>
                {
                    new DateTime(1995, 10, 1),
                    new DateTime(2001, 10, 5),
                    new DateTime(1986, 10, 5),
                    new DateTime(1995, 7, 5),
                    new DateTime(2005, 10, 5),
                    new DateTime(1995, 10, 2),
                    new DateTime(1856, 10, 5),
                    new DateTime(2014, 10, 5),
                    new DateTime(1995, 10, 3),
                    new DateTime(1999, 10, 5)
                };
     
                var dateARechercher = new DateTime(1995, 10, 10);
     
                var dateTrouvees = dates.Where(d=> d.IsDateMonthYearEqual(dateARechercher));
     
                foreach (var dateTrouvee in dateTrouvees)
                {
                    Console.WriteLine(dateTrouvee.ToShortDateString());
                }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                01/10/1995
                02/10/1995
                03/10/1995

    Encore un fois : à toi de l'adapter !

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Merci beaucoup pour ton aide ! Je vais adapter ça comme il le faut, tes exemples sont parfait ! Je le met en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. parser fichier xml
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 24/10/2007, 18h44
  2. [glib] parser fichier xml
    Par .:dev:. dans le forum C
    Réponses: 10
    Dernier message: 18/07/2006, 00h00
  3. [DOM] Erreur parser fichier xml avec caractère spéciaux
    Par turcotm dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/06/2006, 09h01
  4. [XML] [EXPAT] Parser fichier XML
    Par Ben42 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 17/02/2006, 14h08
  5. [XSL] Parser fichier xml : erreurs + incompréhensions
    Par totobouchon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/07/2005, 15h47

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