Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
XML-Лекция 4. Обработка XML в C#.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
409 Кб
Скачать
☆

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" найден, его содержимое добавляется в окно вывода. Таким образом, будут выведены только названия книг.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]