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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

Контроль типів даних при читанні Xml-документа

Клас XmlReader також дозволяє читати дані із строгим контролем типів. Для цього використовуються методи ReadElementContentAs... ReadElementContentAsDouble(), ReadElementContentAsBoolean() та інші. Далі показано як можна прочитати значення в десятковому форматі і виконати обчислення. У прикладі вибирається значення ціни книги, яке збільшується на 25%.

Створимо ще одну кнопку з написом New Price, а в її обробнику напишемо код:

private void btnNewPrice_Click(object sender, EventArgs e)

{

//Обробник кнопки NewPrice - контроль типів

richTextBox1.Clear();

XmlReader rdr = XmlReader.Create("book2.xml");

while (rdr.Read())

{

if (rdr.NodeType == XmlNodeType.Element)

{

if (rdr.Name == "PRICE")

{

decimal price = rdr.ReadElementContentAsDecimal();

richTextBox1.AppendText("Curent Price = "+ price+ "\r\n");

price += price * (decimal)0.25;

richTextBox1.AppendText("New Price = " + price + "\r\n\r\n");

}

else if (rdr.Name=="TITLE")

richTextBox1.AppendText(rdr.ReadElementContentAsString()+"\r\n");

}

}

rdr.Close();

}

 

Якщо це значення не може бути перетворене до необхідного типа, збуджується виключення FormatException.

Компілюємо і запускаємо на виконання наш проект.

В результаті отримуємо повідомлення про помилку. Причина – текст елементу має вигляд:

 

<PRICE>$10.95</PRICE>

Виправимо всі елементи <PRICE> 10.95</PRICE>

а документ збережемо під ім'ям ("book3.xml");

В результаті отримаємо:



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 188; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.150.59 (0.006 с.)