TOC

This article has been localized into Russian by the community.

XML:

Чтение XML с помощью класса XmlReader

В C# существует два основных способа для чтения XML: класс XmlDocument и класс XmlReader. XmlDocument считывает все все содержимое XML в память и позволяет передвигаться вперед и назад по содержимому и даже выполнять запросы с помощью XPath.

XmlReader работает быстрее и использует меньше памяти. Он позволяет вам проходиться через содержимое XML по одному элементу: просмотреть значение и затем перейти к следующему элементу. Поэтому очевидно, что этот способ использует очень мало памяти, так как держит в ней только текущий элемент; а поскольку вы должны вручную проверять значения, вы будете получать только нужные вам элементы, что также говорит о быстроте работы этого класса. В этой главе мы сосредоточимся на классе XmlReader, а затем в следующей главе перейдем к классу XmlDocument.

Давайте рассмотрим маленький пример, где мы читаем XML-документ, содержащий курсы валют. К счастью для нас, в Европейском Центральном Банке есть один документ, который мы можем использовать. Мы можем скачать его и прочитать с жесткого диска, но вообще как XmlReader, так и XmlDocument классы могут прочитать XML с удаленного URL так же хорошо, как и с локального файла. Вы можете увидеть XML здесь (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml), а здесь приводится код и затем его разбор:

using System;
using System.Text;
using System.Xml;

namespace ParsingXml
{
    class Program
    {
        static void Main(string[] args)
        {            
            XmlReader xmlReader = XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
            while(xmlReader.Read())
            {
                if((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Cube"))
                {
                    if(xmlReader.HasAttributes)
                        Console.WriteLine(xmlReader.GetAttribute("currency") + ": " + xmlReader.GetAttribute("rate"));                    
                }
            }
            Console.ReadKey();
        }
    }
}

Мы начали с создания экземпляра класса XmlReader, используя статический метод Create(). У него есть несколько перегрузок, но самый простой из них просто берет URL-ссылку на файл. В цикле while мы вызываем метод Read() экземпляра класса XmlReader. Он перемещает указатель чтения к следующему элементу и возвращает истину (true) до тех пор пока не будет достигнут конец читаемых данных. Теперь внутри цикла мы можем использовать один из многих свойств или методов класса XmlReader, чтобы получить данные из текущего элемента.

В нашем случае мы проверяем NodeType, чтобы увидеть получен ли нами Element (часть тега) и имеет ли он имя "Cube". Как вы можете видеть, в XML-документе, который мы используем, каждый курс вылюты находится внутри элемента, называющимся Cube, поэтому разумеется, что мы рассматриваем только искомые элементы - остальные игнорируем. Как только мы получаем элемент Cube, мы делаем формальную проверку, чтобы убедиться, что у этого элемента есть атрибуты (которые должны быть) и затем мы используем метод GetAttribute(), чтобы прочитать значения двух атрибутов "currency" (валюта) и "rate" (курс). Мы выводим их в Консоль и затем мы перемещаемся к следующему элементу. Результат должен представлять собой законченный список: валюты и их текущий курс.

Как вы можете видеть, это довольно просто сделать, но в основном потому что нам нужны только данные, расположенные в той последовательности, в какой они читаются, без усложнений. В следующей главе мы выполним эту же задачу с помощью класса XmlDocument, так что вы сможете увидеть разницу.

Примечание: Вам следует знать, что существует много случаев, при которых код выше может завершиться с ошибкой и вызывать исключения, которые вы, конечно, должны обработать. Смотрите главу об исключениях для получения дополнительной информации.


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!