Meilleur auteur de réponses
supprimer des lignes dans un ficher XML

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 appelCallAccounting=> 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
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
- Proposé comme réponse Patrice ScribeMVP, Moderator mardi 21 juin 2011 10:58
- Marqué comme réponse Ciprian Duduiala dimanche 26 juin 2011 11:09
-
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".- Modifié Patrice ScribeMVP, Moderator mardi 21 juin 2011 11:02 Boucle ?
- Marqué comme réponse Ciprian Duduiala dimanche 26 juin 2011 11:09
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
- Proposé comme réponse Patrice ScribeMVP, Moderator mardi 21 juin 2011 10:58
- Marqué comme réponse Ciprian Duduiala dimanche 26 juin 2011 11:09
-
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".- Modifié Patrice ScribeMVP, Moderator mardi 21 juin 2011 11:02 Boucle ?
- Marqué comme réponse Ciprian Duduiala dimanche 26 juin 2011 11:09