В статье описывается использование класса
XmlTextReader для чтения из файла инструкций языка XML (Extensible Markup Language). Класс
XmlTextReader обеспечивает прямой синтаксический разбор и выделение инструкций XML и реализует спецификацию XML 1.0, а также пространства имен в спецификации XML консорциума W3C. В данной статье описан быстрый потоковый доступ к XML с использованием маркеров, являющийся альтернативой использованию объектной модели, такой как XML DOM (Document Object Model).
Требования
В приведенном ниже списке перечислены требования к оборудованию, сети, программному обеспечению и пакетам обновления.
- Microsoft Visual Studio 2005 или Microsoft Visual Studio .NET
При написании статьи предполагалось, что пользователь обладает достаточными знаниями в указанных ниже областях.
- Терминология XML.
- Создание и чтение XML-файлов.
Чтение XML из файла.
В данном примере используется файл Books.xml. Можно создать собственный файл Books.xml или воспользоваться файлом, поставляемым с пакетом .NET Software Development Kit (SDK) QuickStarts и расположенным в следующей папке:
\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Samples\QuickStart\Howto\Samples\Xml\Transformxml\Cs
Файл Books.xml необходимо скопировать в папку \Bin\Debug, которая расположена в папке, где создается данный проект. Файл Books.xml также можно загрузить из Интернета. Ссылка для загрузки приведена в разделе "
Ссылки".
- Запустите Visual Studio 2005 или Visual Studio .NET.
- Создайте консольное приложение Visual C#. Перейдите сразу к разделу "Полный листинг кода" или создайте приложение, последовательно выполняя приведенные ниже действия.
- Убедитесь в том, что проект содержит ссылку на сборку System.Xml.dll.
- Укажите директиву using в пространстве имен System.Xml, чтобы избавиться от необходимости указывать объявления XmlTextReader далее в коде. Директиву using необходимо использовать перед всеми остальными объявлениями.
- Создайте экземпляр объекта XmlTextReader и заполните его XML-файлом. Класс XmlTextReader обычно используется для доступа к XML как к неформатированным данным без использования надстройки DOM; таким образом, класс XmlTextReader обеспечивает более быстрый механизм чтения XML. Класс XmlTextReader имеет различные конструкторы для указания местоположения XML-данных. В приведенном ниже коде создается экземпляр класса XmlTextReader и загружается файл Books.xml. Добавьте приведенный ниже код в процедуру Main класса Class1.
XmlTextReader reader = new XmlTextReader ("books.xml");
- Чтение XML. (Отметим, что в данном действии показан внешний цикл "while", а в следующих двух действиях показано использование этого цикла для чтения XML.) После создания объекта XmlTextReader воспользуйтесь для чтения данных XML методом Read. Метод Read последовательно перемещается по XML-файлу до достижения конца файла, после чего возвращает значение "False".
while (reader.Read())
{
// Обработка данных.
Console.WriteLine(reader.Name);
}
Console.ReadLine();
- Изучение узлов. Для обработки данных XML в каждой записи содержится узел, тип которого можно определить по свойству NodeType. Свойства Name и Value возвращают имя узла (имена элемента и атрибута) и значение узла (текст узла) текущего узла (или записи). Перечисление NodeType определяет тип узла. В приведенном ниже примере кода выводится имя элементов и тип документа. Имейте в виду, что в данном примере пропущены атрибуты элементов.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // Узел является элементом.
Console.Write("<" + reader.Name);
Console.WriteLine(">");
break;
case XmlNodeType.Text: // Вывести текст в каждом элементе.
Console.WriteLine (reader.Value);
break;
case XmlNodeType. EndElement: // Вывести конец элемента.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
- Проверка атрибутов. Типы узлов элементов могут включать списки связанных с ними узлов атрибутов. Метод MovetoNextAttribute последовательно перемещается по всем атрибутам элемента. Свойство HasAttributes используется для проверки наличия у узла атрибутов. Свойство AttributeCount возвращает количество атрибутов для текущего узла.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // Узел является элементом.
Console.Write("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Чтение атрибутов.
Console.Write(" " + reader.Name + "='" + reader.Value + "'");
Console.WriteLine(">");
break;
case XmlNodeType.Text: // Вывести текст в каждом элементе.
Console.WriteLine (reader.Value);
break;
case XmlNodeType. EndElement: // Вывести конец элемента.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
- Сохраните и закройте проект.
Полный листинг кода
using System;
using System.Xml;
namespace ReadXMLfromFile
{
/// <summary>
/// Общее описание класса Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
XmlTextReader reader = new XmlTextReader ("books.xml");
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // Узел является элементом.
Console.Write("<" + reader.Name);
Console.WriteLine(">");
break;
case XmlNodeType.Text: // Вывести текст в каждом элементе.
Console.WriteLine (reader.Value);
break;
case XmlNodeType.EndElement: // Вывести конец элемента.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
Console.ReadLine();
}
}
}
Пример выходных данных
<bookstore>
<book>
<title>
Автобиография Бенджамина Франклина
</title>
<author>
<first-name>
Бенджамин
</first-name>
<last-name>
Франклин
</last-name>
</author>
<price>
8.99
</price>
</book>
<book>
<title>
Мошенник
</title>
<author>
<first-name>
Герман
</first-name>
<last-name>
Мелвилл
</last-name>
</author>
<price>
11.99
</price>
</book>
<book>
<title>
Горгий
</title>
<author>
<name>
Платон
</name>
</author>
<price>
9.99
</price>
</book>
</bookstore>
Устранение неполадок
Во время тестирования кода может быть выведено сообщение об ошибке, указанное ниже. Необрабатываемое исключение: System.Xml.XmlException: Неуместное объявление XML. Объявление XML должно быть первым узлом в документе, не предваряемым пробелами.
Дополнительные сведения: Системная ошибка. Исключение возникло в следующей строке: While
Эта ошибка вызвана неправильной инструкцией обработки. Например, инструкция обработки может содержать лишние пробелы. Ниже приведен пример неправильной инструкции обработки:
Этот XML-тег содержит пробел перед скобкой <. Для устранения ошибки удалите пробел.
ССЫЛКИ
Следующий файл доступен для загрузки в центре загрузки Microsoft по адресу:
Свернуть это изображениеРазвернуть это изображение
Загрузить пакет Books.exe.
(http://download.microsoft.com/download/xml/utility/1.0.0.1/wxp/en-us/books.exe)
Дополнительные сведения о классах XML .NET Framework и C# см. на веб-узле MSDN (Microsoft Developer Network) по адресу
Дополнительные сведения о классе
XmlReader см. на веб-узле MSDN по адресу:
Дополнительные сведения о чтении данных XML с помощью класса
XmlReader см. на веб-узле MSDN по следующим адресам:
Более общие сведения о Visual C# .NET или XML в .NET см. в следующих группах новостей Usenet: