C# чтение XML с помощью XmlDocument

Январь 20th, 2012 § 0 comments

В .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

Tagged

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн