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

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.

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