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 :

C# Parser XML Recherche par date


Sujet :

C#

  1. #1
    Membre à l'essai
    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
    Points : 24
    Points
    24
    Par défaut C# Parser XML Recherche par date
    Bonjour,

    Je développe une application qui permet de faire une moyenne du temps de communication des utilisateurs.

    Actuellement je récupère donc un fichier xml, lorsque je rentre le numéro d'un utilisateur, tous le fichier est parcouru et j'ai donc une moyenne qui s'affiche.

    Cependant, je voudrais avoir une moyenne par mois, j'ai donc mis un datepicker mais je bloque légèrement ..!!

    Exemple d'un nœud 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <CallAccounting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CAPTicket_V001.001.xsd">
    		<OmniPCXOffice>
    			<SoftwareVersion>3EH30504DPAA ALZFR820/055.001</SoftwareVersion>
    			<CPUIPAddress>ipaddress</CPUIPAddress>
    		</OmniPCXOffice>
    		<Checksum>808632064</Checksum>
    		<TicketType>Call</TicketType>
    		<ChargedUserType>A</ChargedUserType>
    		<ChargedUserID>1114</ChargedUserID>
    		<SubscriberName>NOM Prenom</SubscriberName>
    		<CommunicationType>Outgoing</CommunicationType>
    		<TrunkType>P</TrunkType>
    		<TrunkID>001</TrunkID>
    		<Date>2014-05-06</Date>
    		<Time>16:14:00</Time>
    		<CallDuration>00:04:24</CallDuration>
    		<TaxesAmount>0</TaxesAmount>
    		<Service>ST</Service>
    		<DialledNumber>0491759075</DialledNumber>
    		<DiallingMode>M</DiallingMode>
    		<RingingDuration>00:00:00</RingingDuration>
    		<Cost>0.00</Cost>
    		<Entity>1</Entity>
    		<Currency>EUR</Currency>
    	</CallAccounting>

    Lorsque je fais la moyenne de l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var number = var number = from call in doc.Root.Elements("CallAccounting")
                             where call.Element("ChargedUserID").Value == textBox2.Text
                             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("Moyenne du temps de communication : " + answer);
    Faut-il utiliser des expressions régulières ?

  2. #2
    Membre habitué

    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2009
    Messages : 62
    Points : 157
    Points
    157
    Par défaut
    Je ne comprends pas ton besoin. Tu veux une moyenne par mois / utilisateur ?

    Si oui alors dans ton ton premier exemple, il te faut aussi sélectionner suivant le tag <Date> ... </Date> dans la condition where suivant l'année et le mois sur lesquels tu veux la moyenne.

    Aucun besoin d'expressions régulières.
    Je ne recommande pas d'utiliser des expressions régulières pour sélectionner les nœuds dans un flux XML. C# offre des APIs permettant de faire cela simplement s'en se prendre la tête avec des expressions régulières.

  3. #3
    Membre à l'essai
    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
    Points : 24
    Points
    24
    Par défaut
    Bonjour lemoussel,

    Mon besoin est en faite de récupérer le temps de communication total d'un utilisateur sur un mois choisis, j'ai donc mon application qui parcours actuellement TOUS le fichier xml et qui additionne tous les <CallDuration>, mais forcément ça additionne TOUS les CallDuration de la personne choisis, exemple :
    Dans cet exemple le numéro de téléphone est le 1114, dans mon application je peux donc entrer 1114 et ça va parcourir tous le fichier xml et additionner tous les callduration du 1114, mais je veux qu'il additionne tous ceux qui sont par exemple dans le mois de mai.

  4. #4
    Membre habitué

    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2009
    Messages : 62
    Points : 157
    Points
    157
    Par défaut
    Dans ton ordre Select, sur le Where tu peux ajouter une condition And sur la date a sélectionner en prenant le mois et l'année.

    Par exemple (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where call.Element("ChargedUserID").Value == textBox2.Text && call.Element("Date").Value.Year == Valeur_Année && call.Element("Date").Value.Month == Valeur_Mois

  5. #5
    Membre à l'essai
    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
    Points : 24
    Points
    24
    Par défaut
    Erreur 1 'string' ne contient pas une définition pour 'Year' et aucune méthode d'extension 'Year' acceptant un premier argument de type 'string' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante*?)

    Impossible de mettre le .Year (call.Element("Date").Value.Year)

  6. #6
    Membre à l'essai
    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
    Points : 24
    Points
    24
    Par défaut
    J'ai fais autrement, je récupère la valeur du dateTimePicker en yyyy-MM et je fais un .contains :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     string month = dateTimePicker1.Value.ToString("yyy-MM");
    var number = from call in doc.Root.Elements("CallAccounting")
                             where call.Element("ChargedUserID").Value == textBox2.Text && call.Element("Date").Value.Contains(month)
                             select call;

  7. #7
    Membre éprouvé
    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
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Pour "Year" c'est une propriété de "DateTime". Or la valeur que tu récupère est un string... l'erreur est donc normal !


    Citation Envoyé par Kisper Voir le message
    J'ai fais autrement, je récupère la valeur du dateTimePicker en yyyy-MM et je fais un .contains :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     string month = dateTimePicker1.Value.ToString("yyy-MM");
    var number = from call in doc.Root.Elements("CallAccounting")
                             where call.Element("ChargedUserID").Value == textBox2.Text && call.Element("Date").Value.Contains(month)
                             select call;
    Ton exemple est un peu bancale :
    Si jamais tu recherches le mois "5" et ta date est "2005-08-06", la méthode "Containt" te renverra "true" alors que c'est l'année qui contient un 5 !
    Je pense qu'il vaudrai mieux "caster" ton élément en "Date". Tu pourra utiliser les propriétés "Year","Month"...

  8. #8
    Membre à l'essai
    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
    Points : 24
    Points
    24
    Par défaut
    Mon DateTime me renvoi une date sous cette forme "2014-05" sachant que les balises sont sous cette forme <Date>2014-05-12</Date>, logiquement il ne devrais pas y avoir de problème !
    Après je suis débutant, donc si cette façon n'est pas sur, autant la changer !

  9. #9
    Membre éprouvé
    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
    Points : 1 056
    Points
    1 056
    Par défaut
    C# est un langage fortement typé... Je pense qu'il vaut mieux utiliser au maximum cet avantage...

  10. #10
    Membre à l'essai
    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
    Points : 24
    Points
    24
    Par défaut
    Je vais avancer sur deux trois petites tant que cette façon marche, après je modifierai, merci de votre aide.

    Bonne journée

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

Discussions similaires

  1. [AC-2000] Recherche par date comprise dans un intervalle
    Par polo31 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/04/2020, 16h56
  2. [MySQL] Faire une recherche par DATE
    Par bullrot dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 14/10/2008, 14h38
  3. Faire une recherche par date
    Par ghnawfal dans le forum JSF
    Réponses: 13
    Dernier message: 11/04/2008, 07h35
  4. recherche par date vba excel
    Par fred014 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/03/2007, 13h35
  5. Moteur de recherche par date
    Par Prue dans le forum ASP
    Réponses: 17
    Dernier message: 27/08/2003, 16h07

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