Each LANGUAGE has 12 records so I wanted a summary for each language and then spit it out into a .csv file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!--xml version="1.0" encoding="UTF-8" ?--> < file_name >TELEPHONE__2011-01-26.XML</ file_name > < record_count >345</ record_count > < crp:phone_statistics > < record_number >1</ record_number > < language >SWE</ language > < handled >12</ handled > < abandoned >1</ abandoned > < talk_time >4533</ talk_time > < queue_time >2400</ queue_time > < handled_time >6292</ handled_time > < abandon_time >204</ abandon_time > < speed_answer >2196</ speed_answer > </ crp:phone_statistics > </ crp:phone_statistics_table > |
I got nice exceptions occurring because of the namespace prefix when I first tried the following code:
1 2 3 4 5 6 7 8 9 10 | var stats = from stat in xd.Descendants( "CRP:PHONE_STATISTICS" ) where stat.Element( "LANGUAGE" ).Value == language select new { Handled = int .Parse(stat.Element( "HANDLED" ).Value), Abandoned = int .Parse(stat.Element( "ABANDONED" ).Value), Language = stat.Element( "LANGUAGE" ).Value }; |
So I then found out that I could prefix the element names with the actual namespace provided in the root element of the document, like this:
1 2 3 4 5 | var stats = from stat in xd.Descendants(ns + "PHONE_STATISTICS" ) |
The end result looks like this:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | namespace XMLSummarizer { class Program { static void Main( string [] args) { string txtLogFileName = @"data.csv" ; string XMLfolder = Directory.GetCurrentDirectory(); TextWriter tw = new StreamWriter(txtLogFileName); tw.WriteLine( "Date;Month;Handled;Abandoned;Language" ); foreach (var file in System.IO.Directory.EnumerateFiles(XMLfolder, "*.xml" )) { DateTime statsDate = DateTime.Parse(file.Substring(file.IndexOf( "_PHONE" ) + 7, 10)); Console.WriteLine(statsDate.ToShortDateString()); XDocument xd = XDocument.Load(file); string [] languages = new string [] { "SWE" , "DAN" , "NOR" , "FIN" }; foreach ( string language in languages) { SummarizeDataPerDay(ns, tw, xd, language, statsDate); } } tw.Flush(); tw.Close(); Console.WriteLine( "Operation completed successfully. Press [Enter] to close application." ); Console.ReadLine(); } private static void SummarizeDataPerDay(XNamespace ns, TextWriter tw, XDocument xd, string language, DateTime dataDate) { var stats = from stat in xd.Descendants(ns + "PHONE_STATISTICS" ) where stat.Element( "LANGUAGE" ).Value == language select new { Handled = int .Parse(stat.Element( "HANDLED" ).Value), Abandoned = int .Parse(stat.Element( "ABANDONED" ).Value), Language = stat.Element( "LANGUAGE" ).Value }; string lang = "" ; int handledCalls = 0; int abandonedCalls = 0; foreach (var stat in stats) { handledCalls += stat.Handled; abandonedCalls += stat.Abandoned; lang = stat.Language; } tw.WriteLine(dataDate + ";" + dataDate.Month + ";" + handledCalls + ";" + abandonedCalls + ";" + lang); } } } |