2.1. Использование класса XmlReader
Пример чтения данных XML из файла. Данные хранятся в файле "book2.xml" и представляют собой описание книжного каталога:
<?xml version="1.0" encoding="Windows-1251"?>
<INVENTORY>
<BOOK>
<TITLE>Страны Мира </TITLE>
<AUTHOR>Книжний Клуб</AUTHOR>
<BINDING>Харьков</BINDING>
<PAGES>380</PAGES>
<PRICE>$4.00</PRICE>
</BOOK>
<BOOK>
<TITLE>Секреты работы в Windows</TITLE>
<AUTHOR>Дэвид Маккормик</AUTHOR>
<BINDING>Харьков</BINDING>
<PAGES>300</PAGES>
<PRICE>$5.20</PRICE>
</BOOK>
<BOOK>
<TITLE>Выбор и модернизация компьютера</TITLE>
<AUTHOR>Михаил Кутузов</AUTHOR>
<BINDING>Питер - Москва </BINDING>
<PAGES>320</PAGES>
<PRICE>$6.30</PRICE>
</BOOK>
<BOOK>
<TITLE>3d max</TITLE>
<AUTHOR>Кэлли Мердок</AUTHOR>
<BINDING>Киев-Москва</BINDING>
<PAGES>1050</PAGES>
<PRICE>$10.95</PRICE>
</BOOK>
<BOOK>
<TITLE>Система Программирования Delphi</TITLE>
<AUTHOR>Волков Андрей</AUTHOR>
<BINDING>Москва</BINDING>
<PAGES>800</PAGES>
<PRICE>$10.95</PRICE>
</BOOK>
<BOOK>
<TITLE>Как собрать свой компьютер</TITLE>
<AUTHOR>Джон Косли</AUTHOR>
<BINDING>Москва</BINDING>
<PAGES>300</PAGES>
<PRICE>$6.90</PRICE>
</BOOK>
<BOOK>
<?MyApp Part="value 1" Parm2="value 2" ?>
<TITEL>dfsdfdfsdf</TITEL>
<AUTHOR>sdfsdf</AUTHOR>
<!-- sdfsdfsdfsdf -->
<BINDING>фіваваіва</BINDING>
<PAGES>234</PAGES>
<PRICE>$12.8</PRICE>
</BOOK>
</INVENTORY>
Создадим форму с двумя кнопками и текстовым редактором (richTextBox1), в который будем размещать прочитанные данные.
При нажатии кнопки ReadXml выполняется чтение и разбор XML-файла и вывод его в текстовый редактор. Обработчик кнопки ReadXML_Click:
private void ReadXML_Click(object sender, EventArgs e)
{
//чтение файла
richTextBox1.Clear(); //очистка редактора
XmlReader rdr = XmlReader.Create("book2.xml");//создание объекта rdr
while (rdr.Read())
{
if (rdr.NodeType == XmlNodeType.Text)
richTextBox1.AppendText(rdr.Value + "\r\n");
}
}
Класс XmlReader является абстрактным, т.есть, для таких классов нельзя создавать объекты оператором new. Для того, чтобы его можно было использовать, нужно включить в него статические методы.
В этом обработчике используется статический метод Create, который возвращает объект XmlReader. Дальше в цикле while выполняется чтение каждой строки файла . По мере чтения производится проверка свойства NodeType. Если узел является текстовым, в текстовый редактор добавляется его содержимое.
2.2. Методы чтения данных
Классы для работы с XML предоставляют несколько способов передвижения по XML-документу. Например, метод Read() перемещает на следующий узел. Потом можно проверить, имеет ли этот узел содержимое (HasValue() ) или атрибуты (YasAttributes()).
Основные методы анализа документа представлены в таблице ниже.
Read() |
читает очередную запись и перемещает на следующий узел |
HasValue() |
возвращает true, если элемент имеет содержимое, false – противном случае |
HasAttributes() |
просматривает элемент на наличие атрибутов. Возвращает true, если элемент имеет содержимое, false – противном случае |
ReadStartElement() |
проверяет, является ли узел корневым, после чего смещается на следующий узел. Если узел не корневой, возбуждается исключение XmlException. |
IsStartElement() |
аналогичен методу ReadStartElement() |
ReadString() |
чтение одной строки из файла, содержащего документ |
ReadElementString() |
подобен методу ReadString() за исключением того, что ему можно передать имя элемента. Если следующий узел с содержимым не является начальным дескриптором или если параметр Name не совпадает с текущим параметром узла, возбуждается исключение |
MoveToContent() |
перемещение к содержимому узла |
Пример 2. Вывод отдельных элементов XML-документа
Рассмотрим применения метода ReadElementString() и других методов, а также применение файловых потоков (чтения из файла).
Не забыть подключить using System.IO;
Добавим на форму кнопку Read from file. Код обработчика будет следующим:
private void btmReadXml2_Click(object sender, EventArgs e)
{
//чтение только название книг (элемент "TITLE"
richTextBox1.Clear();
FileStream fs = new FileStream("book2.xml", FileMode.Open);
XmlReader rdr = XmlReader.Create(fs);
while (!rdr.EOF)
{
//Если попадаем на тип элемента, проверить его и загрузить в окно
if (rdr.MoveToContent() == XmlNodeType.Element && rdr.Name == "TITLE")
{
richTextBox1.AppendText(rdr.ReadElementString() + "\r\n");
}
else
{
// в противном случае - переместиться на след.запись
rdr.Read();
}
}
}
В этом примере в цикле while используется метод MoveToContent() для поиска узла типа XmlNodeType. Element с названием книги rdr.Name == "TITLE")
if (rdr.MoveToContent() == XmlNodeType.Element && rdr.Name == "TITLE")
Просмотр выполняется до конца файла (условие цикла
while (!rdr.EOF)
Если типом узла не является элемент или его имя не совпадает с "TITLE", то вызывается метод Read() для перехода к следующему узлу. Если очередной узел "TITLE" найден, его содержимое добавляется в окно вывода. Таким образом, будут выведены только названия книг.
