TOC

This article has been localized into Russian by the community.

XML:

Чтение 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 и данных, которые вам нужны. В этом примере код, описанный выше, будет отлично работать и даже не потребует написания большого кода, но в других случаях, вы можете захотеть написать немного больше кода для повышения читабельности.

Как только мы получаем узел с курсом валюты, мы получаем доступ к двум свойствам, которые нам нужны, и затем выводим их в консоль, как в примере в предыдущей главе.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!