This article has been localized into Russian by the community.
Чтение XML с помощью класса XmlDocument
Как описано в предыдущей главе, подход с использованием XmlDocument занимает больше памяти и возможно немного медленнее, чем подход с использованием XmlReader. Однако во многих случаях XmlDocument может быть легче в использовании и часто требует написания меньшего количества кода. Как только содержимое XML будет прочитано, вы можете считать данные в виде иерархии, прямо как XML-структура, с корневым элементом, который может содержать дочерние элементы, которые в свою очередь также могут иметь дочерние элементы и так далее. В предыдущей главе мы парсили XML-данные из Европейского Центрального Банка с курсами валют, и сейчас мы сделаем тоже самое, только с помощью класса XmlDocument.
XML можно найти на следующей URL (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml), данные, которые нам нужны, находятся в элементах <cube>. В древовидной структуре это выглядит примерно следующим образом:
<gesmes:Envelope>
[other child nodes]
<Cube>
<Cube time="2011-04-12">
<Cube currency="USD" rate="1.4470"/>
<Cube currency="JPY" rate="121.87"/>
…
gesmes:Envelope - наш корневой элемент, который можно получить через свойство DocumentElement. После этого мы сможем получить доступ к дочерним элементам этого узла через свойство-коллекцию ChildNodes. В нашем примере нам нужны дочерние элементы на три уровня ниже корневого. Мы можем сделать это с помощью следующего кода, который в сущности такой же, как основанный на XmlReader код из предыдущей главы:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
foreach(XmlNode xmlNode in xmlDoc.DocumentElement.ChildNodes[2].ChildNodes[0].ChildNodes)
Console.WriteLine(xmlNode.Attributes["currency"].Value + ": " + xmlNode.Attributes["rate"].Value);
Console.ReadKey();
}
}
}
Как видите, мы получили узлы Cube, спускаясь по иерархии дочерних элементов ChildNodes. Из элемента DocumentElement (не корневого элемента) мы запросили дочерний узел третьего уровня (индексация уровней начинается с нуля), затем мы запросили его первый дочерний узел, и затем мы запросили коллекцию дочерних узлов. Разумеется это возможно только потому что мы знаем структуру документа XML, и это определенно не очень гибко, красиво и не очень просто изменяется в дальнейшем. Однако способ, которым вы пользуетесь для навигации по XML-документу, очень сильно зависит от источника XML и данных, которые вам нужны. В этом примере код, описанный выше, будет отлично работать и даже не потребует написания большого кода, но в других случаях, вы можете захотеть написать немного больше кода для повышения читабельности.
Как только мы получаем узел с курсом валюты, мы получаем доступ к двум свойствам, которые нам нужны, и затем выводим их в консоль, как в примере в предыдущей главе.