Читання XML-документа за допомогою XmlNodeList 


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



ЗНАЕТЕ ЛИ ВЫ?

Читання XML-документа за допомогою XmlNodeList



Створимо нове застосування WINXML-DOM WindowsApplication, який читатиме дані книжкового каталога і завантажуватиме назви книг у вікно списку.

Для різноманітності дані виводитимемо в Listbox. Це аналогічно прикладу використання XmlReader. Відмінність полягає в тому, що здійснюється вибір, з якими вузлами ми хочемо працювати, замість того аби використовувати весь документ. Ось код для виконання цього прикладу в середовищі XmlNode.

Додамо на форму список і дві кнопки. Крім того, додамо текстові поля для наступної версії програми.

 

 

При натисненні кнопки Чтение в список виводимо назви книг. Обробник кнопки:

private void btmReadXML_Click(object sender, EventArgs e)

{

// змінити дорогу доступу відповідно до структури доріг доступу

 

doc.Load("book2.xml");

// отримати лише ті вузли, які потрібні

XmlNodeList nodeLst=doc.GetElementsByTagName("TITLE");

// ітерації за списком XmlNodeList

foreach(XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);

}

Зверныть увагу, що ми додали наступне оголошення на рівні модуля:

public partial class Form1: Form

{

public XmlDocument doc = new XmlDocument();

public Form1()

{

InitializeComponent();

}

Якби це було все, що потрібно зробити, то використання XmlReader було б значно ефективнішим способом завантаження вікна списку. Причина в тому, що ми пройшли через документ один раз і потім закінчили з ним роботу. Проте, якщо бажано повторно відвідати вузол, то використання XmlDocument є кращим для цього способом.

 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{

// створити рядок пошуку XPath

string srch = "INVENTORY/BOOK[TITLE='" + listBox1.SelectedItem.ToString() + "']";

// пошук додаткових даних

XmlNode foundNode = doc.SelectSingleNode(srch);

if (foundNode!= null) MessageBox.Show(foundNode.InnerText);

else MessageBox.Show("Not found");

 

}

 

В цьому прикладі listbox із заголовками завантажується з документа book2.xml. Коли ми клацаємо на вікні списку, викликаючи породження події SelectedIndexChange, ми беремо текст вибраного пункту в listbox, в даному випадку заголовок книги, створюємо оператор XPath і передаємо його в метод SelectSingleNode об'єкту doc. Він повертає елемент book, частиною якого є TITLE (foundNode). Виведемо для наочності InnerText вузла у вікні повідомлення. Ми можемо продовжувати клацати на елементах в listbox скільки завгодно раз, оскільки документ завантажений і залишається завантаженим, поки ми його не звільнимо.

Невеликий коментар відносно методу SelectSingleNode. Це реалізація XPath в класі XmlDocument. Існують методи SelectSingleNode і SelectNodes. Обидва вони визначені в XmlNode, на якому грунтується XmlDocument. SelectSingleNode повертає XmlNode, і SelectNodes повертає XmlNodeList.

 

10.2.2. Вставка елементів (вузлів) в XML- документ

Раніше розглядався приклад XmlTextWriter, який створює новий документ. Обмеження полягало у тому, що він не вставляв вузол в поточний документ. Це можна зробити за допомогою класу XmlDocument.

Створимо в обробнику кнопки Запис код, що Додає в список і файл нову книгу (елемент BOOK).

private void btmSaveXML_Click(object sender, EventArgs e)

{

// змінити дорогу доступу, як потрібний існуючою структурою

doc.Load("book2.xml");

// створити новий елемент 'book'

XmlElement newBook = doc.CreateElement("BOOK");

 

// створити новий елемент 'title'

XmlElement newTitle = doc.CreateElement("TITLE");

newTitle.InnerText = "Основи інженерії якості ПС";

newBook.AppendChild(newTitle);

 

// створити новий елемент author

XmlElement newAuthor = doc.CreateElement("AUTHOR");

newAuthor.InnerText = "Коротун Т.";

newBook.AppendChild(newAuthor);

 

XmlElement newName = doc.CreateElement("AUTHOR");

newAuthor.InnerText = "Коваль Г.";

newBook.AppendChild(newAuthor);

 

// створити новий елемент Binding

 

XmlElement newBind = doc.CreateElement("BINDING");

newBind.InnerText = "Академперіодіка";

newBook.AppendChild(newBind);

 

//

XmlElement newPages = doc.CreateElement("PAGES");

newPages.InnerText = "650";

newBook.AppendChild(newPages);

//

XmlElement newPrice = doc.CreateElement("PRICE");

newPrice.InnerText = "150";

newBook.AppendChild(newPrice);

 

// додати до поточного документа

doc.DocumentElement.AppendChild(newBook);

 

// записати doc на диск

 

XmlTextWriter tr = new XmlTextWriter("booksEdit.xml", null);

 

tr.Formatting = Formatting.Indented;

 

doc.WriteContentTo(tr);

 

tr.Close();

// завантажити listBox1 зі всіма заголовками, включаючи новий

 

listBox1.Items.Clear();

XmlNodeList nodeLst = doc.GetElementsByTagName("TITLE");

foreach (XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);

 

}

 

При виконанні цього коду буде отримана функціональність попереднього прикладу, але у вікні списку з'явилася одна додаткова книга "Основи інженерії якості ПС". Клацання миші на заголовку цієї книги приведе до виведення такої ж інформації, як і для інших книг.

В цьому прикладі спочатку створюється новий елемент BOOK:

 

XmlElement newBook = doc.CreateElement("BOOK");

Метод CreateElement має три перенавантажені версії, які дозволяють визначити ім'я елементу, ім'я і простір імен URI, і, нарешті, prefix (префікс), lоcalname (локальне ім'я) і namespace (простір імен).

Потім додаються нові елементи, вкладені в елемент BOOK.

// створити новий елемент 'title'

XmlElement newTitle = doc.CreateElement("TITLE");

newTitle.InnerText = "Основи інженерії якості ПС";

newBook.AppendChild(newTitle);

 

Тут знову створюється новий об'єкт на основі XmlElement (newTitle). Призначимо властивості InnerText заголовок нової книги і додаємо нащадок до елементу book. Потім це повторюється для решти елементів book.

Нарешті, ми додаємо елемент newBook до вузла doc.DocumentElement. Це той же рівень, що і в усіх інших елементів book. Ми замінили існуючий документ новим, на відміну від XmlWriter, де можна було лише створити новий документ. Останнє, що потрібно зробити, це записати новий документ XML на диск. В даному прикладі ми створюємо новий XmlTextWriter і передаємо його в метод WriteContentTo. Не забудьте викликати метод Close на XmlTextWriter, аби скинути вміст внутрішніх буферів і закрити файл.

Методи WriteContentTo і WriteTo отримують XmlTextWriter як параметр. WriteContentTo зберігає поточний вузол і всіх нащадків в XmlTextWriter, тоді як WriteTo зберігає поточний вузол. Оскільки doc є об'єктом на основі XmlDocument, він представляє весь документ і тому буде збережений. Можна було б також використовувати метод Save. Він завжди зберігатиме весь документ. Save має чотири перенавантажені версії. Можна визначити рядок з ім'ям файлу і шляхом доступу, об'єкт на основі класу Stream, об'єкт на основі класу TextWriter, або об'єкт на основі XmlWriter. Саме це було використано при виконанні прикладу. Додамо новий елемент в кінець списку:

 

listBox1.Items.Clear();

XmlNodeList nodeLst = doc.GetElementsByTagName("TITLE");

foreach (XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);

 

В цьому прикладі вміст елементів формувався просто в обробнику кнопки.

Наступний приклад демонструє створення XML-елементів, вміст яких береться з текстових полів форми при натисненні кнопки Добавить:

 

 

Обробник кнопки Добавить:

 

private void btmAdd_Click(object sender, EventArgs e)

{

// змінити дорогу доступу, як потрібний існуючою структурою

doc.Load("book2.xml");

// створити новий елемент 'book'

XmlElement newBook = doc.CreateElement("BOOK");

 

// створити новий елемент 'title'

XmlElement newTitle = doc.CreateElement("TITLE");

newTitle.InnerText = txtName.Text;

newBook.AppendChild(newTitle);

 

// створити новий елемент author

XmlElement newAuthor = doc.CreateElement("AUTHOR");

newAuthor.InnerText = txtAuthor1.Text;

newBook.AppendChild(newAuthor);

 

if (txtAuthor2.Text.Length!= 0)

{

XmlElement newName = doc.CreateElement("AUTHOR");

newAuthor.InnerText = txtAuthor2.Text;

newBook.AppendChild(newAuthor);

}

 

// створити новий елемент Binding

 

XmlElement newBind = doc.CreateElement("BINDING");

newBind.InnerText = txtPub.Text;

newBook.AppendChild(newBind);

 

//

XmlElement newPages = doc.CreateElement("PAGES");

newPages.InnerText = txtPages.Text;

newBook.AppendChild(newPages);

//

XmlElement newPrice = doc.CreateElement("price");

newPrice.InnerText = txtPrice.Text;

newBook.AppendChild(newPrice);

 

// додати до поточного документа

doc.DocumentElement.AppendChild(newBook);

 

// записати doc на диск

 

XmlTextWriter tr = new XmlTextWriter("booksEdit.xml", null);

 

tr.Formatting = Formatting.Indented;

 

doc.WriteContentTo(tr);

 

tr.Close();

// завантажити listBox1 зі всіма заголовками, включаючи новий

 

listBox1.Items.Clear();

XmlNodeList nodeLst = doc.GetElementsByTagName("TITLE");

foreach (XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);

}

 

Якщо потрібно створити документ із самого початку, можна використовувати клас XmlTextWriter. Можна також використовувати XmlDocument. Який з них вибрати? Якщо дані, які бажано помістити в XML, доступні і готові для запису, то підійде клас XmlTextWriter. Проте, якщо необхідно створити документ XML поступово, вставляючи вузли в різні місця, то найбільш прийнятним буде використання XmlDocument.

 

Обробка атрибутів

Зазвичай атрибути не розглядаються як частина структури документа. Але, при необхідності, можна визначити їх наявність і витягувати значення. Для витягання і запису атрибутів можна (як для елементів) використовувати класи XmlReader, XmlWriter, а також XmlDocument.

 



Поделиться:


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

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