none
supprimer des lignes dans un ficher XML RRS feed

  • Question

  • Bonjour,

    je solicite votre aide, c est à propos d'un fichier XML, enfaite j'extrait des donnees d'un fichier XML, qui est composer de plusieurs appels telephonique.

    Je voudrais une fois traiter les informations d'un poste (100 par exemple ,celui-ci est contenue dans une variable tiré d'une textBox), supprimer les lignes correspondant a l'appel.

    Voici comment est composer mon fichier XML

     

     

    <?xml version="1.0" encoding="UTF-8"?>
    <CallAccountingList>
    ...
    	<CallAccounting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CAPTicket_V001.001.xsd">*
    		<OmniPCXOffice>
    			<SoftwareVersion>3EH30369BVAA ALZQO510/023.004</SoftwareVersion>
    			<CPUIPAddress>192.168.92.246</CPUIPAddress>
    		</OmniPCXOffice>
    		<Checksum>550119011</Checksum>
    		<TicketType>Call</TicketType>
    		<ChargedUserType>A</ChargedUserType>
    		<ChargedUserID>100</ChargedUserID>
    		<SubscriberName>PO</SubscriberName>
    		<CommunicationType>Outgoing</CommunicationType>
    		<TrunkType>N</TrunkType>
    		<TrunkID>001</TrunkID>
    		<Date>2007-06-15</Date>
    		<Time>13:37:00</Time>
    		<CallDuration>00:00:25</CallDuration>
    		<TaxesAmount>0</TaxesAmount>
    		<Service>ST</Service>
    		<DialledNumber>0156412361</DialledNumber>
    		<DialledMode>M</DialledMode>
    		<RingingDuration>00:00:00</RingingDuration>
    		<Cost>0,77</Cost>
    		<Currency>EUR</Currency>
    	</CallAccounting>
    ...
    </CallAccountingList>
    


    CallAccounting=> Balise pour un appel

    CallAccounting=> Balise pour tout les appel

     

    Je traite les informations de cette facon :

     

       XDocument xDoc = XDocument.Load("C:\\Projet\\TicketCollector.XML");// Chargement du fichier .xml
       IEnumerable<XElement> elements = xDoc.Elements("CallAccountingList").Elements("CallAccounting").Where(el => el.Element("ChargedUserID").Value == chargedUserID && el.Element("CommunicationType").Value == "Outgoing"); // Recherche des éléments pour lesquels : 'ChargedUserID = NumPoste' et 'CommunicationType = Outgoing'
       using (StreamWriter sw = new StreamWriter("C:\\Projet\\Facture_detail.txt", true)) //Ouverture en écriture du fichier ,si non existant creation du fichier FicheClient.
       {
        foreach (XElement el in elements)// Boucle sur les éléments retenus
        {
    
         lineMessage = String.Format("Date {0}, Heure {1}, Duree {2}, Numero.Appelle {3}, Prix {4}", el.Element("Date").Value, el.Element("Time").Value, el.Element("CallDuration").Value, el.Element("DialledNumber").Value, el.Element("Cost").Value);
         sw.WriteLine(lineMessage);
         counter++;//Compte le nombre de communication
         Prix = String.Format("{0}", el.Element("Cost").Value);
         Double.TryParse(Prix, out Cost);
         TotalCost += Cost;
        }
       }
       compteur = Convert.ToString(counter);
    


     

     


    Jérémy
    lundi 20 juin 2011 10:59

Réponses

  • Bonjour,

    une fois la boucle terminée vous appelez la méthode Remove<T>  sur les éléments.

    elements.Remove();
    


    Pour sauvegarder vous écrasez le fichier d'origine, en sauvegardant le XDocument duquel vous avez supprimé les noeuds :

    xDoc.Save("./data.xml");
    

    Cordialement

     

     




    lundi 20 juin 2011 16:34
    Modérateur
  • Bonjour,

    La solution proposée ici (http://stackoverflow.com/questions/1532818/removing-xelements-in-a-foreach-loop) me parait bien :

    elements.ToList().ForEach(x => x.Remove());
    
        MessageBox.Show(xDoc.ToString()); // Vérifier ce qui reste pour voir si cela vous convient
    
    

    Cf plutôt la solution de Nikho, je ne vois pas pourquoi je me suis cru obligé hier de faire une boucle ?!;-)

    A mettre donc après la boucle de traitement (avec el.Remove() à l'intérieur de la boucle de traitement on aurait sans doute le problème "classique" que l'on rencontre lorsqu'on modifie une collection que l'on en train en même temps de parcourir). 


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 20 juin 2011 17:01
    Modérateur

Toutes les réponses

  • Bonjour,

    une fois la boucle terminée vous appelez la méthode Remove<T>  sur les éléments.

    elements.Remove();
    


    Pour sauvegarder vous écrasez le fichier d'origine, en sauvegardant le XDocument duquel vous avez supprimé les noeuds :

    xDoc.Save("./data.xml");
    

    Cordialement

     

     




    lundi 20 juin 2011 16:34
    Modérateur
  • Bonjour,

    La solution proposée ici (http://stackoverflow.com/questions/1532818/removing-xelements-in-a-foreach-loop) me parait bien :

    elements.ToList().ForEach(x => x.Remove());
    
        MessageBox.Show(xDoc.ToString()); // Vérifier ce qui reste pour voir si cela vous convient
    
    

    Cf plutôt la solution de Nikho, je ne vois pas pourquoi je me suis cru obligé hier de faire une boucle ?!;-)

    A mettre donc après la boucle de traitement (avec el.Remove() à l'intérieur de la boucle de traitement on aurait sans doute le problème "classique" que l'on rencontre lorsqu'on modifie une collection que l'on en train en même temps de parcourir). 


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 20 juin 2011 17:01
    Modérateur