- •Лекция 5. Создание xml-документов в .Net
- •1. Использование класса XmlWriter - запись потоков данных Xml
- •2. Использование dom в .Net
- •2.1. Чтение xml-документа с помощью XmlNodeList
- •2.2. Вставка элементов (узлов) в xml- документ
- •3. Обработка атрибутов
- •3.1. Извлечение атрибутов с помощью XmlReader
- •3.2. Вставка атрибутов в документ с помощью XmlWriter
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.
