Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_ПАРАДИГМИ ПРОГРАМУВАННЯ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.32 Mб
Скачать

9.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. Якщо вузол є текстовим, в текстовий редактор додається його вміст.

9.2.2. Методи читання даних

Класи для роботи з XML надають декілька способів пересування по XML-документу. Наприклад, метод Read() переміщає на наступний вузол. Потім можна перевірити, чи має цей вузол вміст (HasValue() ) або атрибути (HasAttributes()).

Основні методи аналізу документа представлені в таблиці нижче.

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

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