В .NET есть целое пространство имен для работы с XML, но среди всего этого изобилия мне было трудно найти простое решение. Конечно, оно существовало, но среди всех этих классов, сразу не разберешься. Тут я представлю несколько способов для работы с XML в C#, для каждой конкретной задачи подходит именно свой, какой решите сами.
Для экспериментов возьмем готовый xml файл, так будет наглядней
<?xml version="1.0" encoding="UTF-8"?> <GetPriceResearchResponse> <Ack>Success</Ack> <ProcessingTime>5.645</ProcessingTime> <Timestamp>2012-01-20T09:06:26.000Z</Timestamp> <Version>2</Version> <CallsRemaining>593</CallsRemaining> <CallLimitResetTime>2012-02-18T04:31:08Z</CallLimitResetTime> <Statistics> <TotalSales currency=dollars>198565.18</TotalSales> <TotalSoldItems>2889</TotalSoldItems> <AverageSoldPrice>68.73</AverageSoldPrice> <MaxSoldPrice>3052.00</MaxSoldPrice> <MinSoldPrice>0.01</MinSoldPrice> </Statistics> </GetPriceResearchResponse>
Первый и самый простой, наверное, это использовать класс XmlDocument, нахожу его, наверное, самым простым в использовании, но его основной недостаток в том, что нужно помещать в память весь xml документ, т.е. если мы имеем много мегабайтный xml, к тому же данные из него нужны не все, а только часть, то это будет не самый лучший выбор. Рассмотрим пример кода.
XmlDocument doc = new XmlDocument(); doc.LoadXml(data); XmlNodeList nodes = doc.GetElementsByTagName("GetPriceResearchResponse"); foreach (XmlNode node in nodes[0].ChildNodes) { for (int i = 0; i < node.ChildNodes.Count;i++ ) { Console.WriteLine("[item] {1} = {0}", node.ChildNodes[i].InnerText, node.ChildNodes.Count > 1 ? node.ChildNodes[i].Name : node.Name); if (node.ChildNodes[i].Attributes!=null) for (int j = 0; j < node.ChildNodes[i].Attributes.Count; j++) Console.WriteLine("\tattribute {0}={1}", node.ChildNodes[i].Attributes[j].Name, node.ChildNodes[i].Attributes[j].Value); } } //Если этого объекта не будет в xml файле вы получите NullReferenceException Console.WriteLine("\nThis is AverageSoldPrice = {0}", nodes[0]["Statistics"]["AverageSoldPrice"].InnerText); Console.WriteLine("\nThis is TotalSales attribute : {0}={1}", nodes[0]["Statistics"]["TotalSales"].Attributes["currency"].Name, nodes[0]["Statistics"]["TotalSales"].Attributes["currency"].Value);
После исполнения этого кода вы получите следующий результат.
[item] Ack = Success [item] ProcessingTime = 3.863 [item] Timestamp = 2012-01-20T07:28:16.000Z [item] Version = 2 [item] CallsRemaining = 594 [item] CallLimitResetTime = 2012-02-18T04:31:08Z [item] TotalSales = 7324.22 attribute currency=dollars [item] TotalSoldItems = 151 [item] AverageSoldPrice = 48.50 [item] MaxSoldPrice = 195.00 [item] MinSoldPrice = 1.26 This is AverageSoldPrice = 48.50 This is TotalSales attribute : currency=dollars
Оставить комментарий