
- •Язык xml
- •Пространства имён
- •Объектная модель xml документа
- •Перечисление XmlNodeType
- •Класс XmlDocument
- •Использование объектной модели документа
- •Запись xml документа
- •Чтение xml документа
- •Последовательный доступ к xml документу
- •Класс XmlTextWriter
- •Класс XmlTextReader
- •Сериализация (Serialization)
- •Класс из графа объектов
- •Сериализация с помощью XmlSerializer
- •Пример сериализации
- •Результат сериализации
- •Пример десериализации
- •Управление генерируемым xml
- •Использование атрибутов
- •Результат сериализации
- •Использование атрибутов сериализации
- •Сериализация коллекций
- •Десериализация коллекции
Класс XmlDocument
Класс XmlDocument представляет корень документа в объектном представлении документа.
Использование объектной модели документа
Использование объектной модели XML документа позволяет открыть файл считать документ в память, затем закрыть файл и работать с объектной моделью XML документа в памяти. После чего если были внесены изменения документ может быть записан на диск. При работе с объектной моделью документа в памяти доступ к документу может осуществляться в произвольном порядке.
Запись xml документа
static void Main()
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<books> </books>");
XmlElement book = doc.CreateElement("book");
XmlElement title = doc.CreateElement("title");
title.InnerText = ".NET Framework Programming";
XmlElement author = doc.CreateElement("author");
author.InnerText = "Jeffrey Richter";
XmlElement price = doc.CreateElement("price");
price.SetAttribute("format","euros");
price.InnerText="39.99";
book.AppendChild(title);
book.AppendChild(author);
book.AppendChild(price);
doc.DocumentElement.AppendChild(book);
doc.Save("books.xml");
}
Из строки загружается XML документ содержащий один корневой элемент <books>. Создаётся элемент <book> для книги. Создаются три элемента <title>, <author> и <price>. Для каждого из трёх элементов задаётся текст внутри элемента. У элемента <price> объявляется атрибут format его значение "euros". Все три элемента добавляются в элемент <book>. Который в свою очередь добавляется в корневой элемент <books>. Полученная объектное представление документа записывается в файл.
Получившийся XML документ:
<books>
<book>
<title>.NET Framework Programming</title>
<author>Jeffrey Richter</author>
<price format="euros">39.99</price>
</book>
</books>
Чтение xml документа
Функция работает рекурсивно. Она получает список узлов и последовательно их обрабатывает. Для каждого узла определяется тип. В зависимости от типа узла получается разная информация об узле. Информация записывается в изменяемую строку символов. После определения типа узла и получения информации об узле проверяется есть ли у узла атрибуты. Если у узла есть атрибуты то информация о каждом из них записывается в изменяемую строку. Затем проверяется есть ли у узла потомки. Если у узла есть потомки то для каждого из них функция вызывает сама себя. Возвращаемые значения добавляются в изменяемую строку символов. В конце получившаяся изменяемая строка превращается в обычную строку которая возвращается функцией.
private static string ReadXML(XmlNodeList nodeList)
{
StringBuilder str = new StringBuilder();
foreach (XmlNode node in nodeList)
{
switch (node.NodeType)
{
case XmlNodeType.XmlDeclaration:
str.AppendFormat("Объявление XML : {0} {1} \n", node.Name, node.Value);
break;
case XmlNodeType.Element:
str.AppendFormat("Элемент: {0} \n",node.Name);
break;
case XmlNodeType.Text:
str.AppendFormat(" Значение: {0} \n",node.Value);
break;
case XmlNodeType.Comment:
str.AppendFormat("Комментарий: {0} \n", node.Value);
break;
}
if (node.Attributes != null)
{
foreach (XmlAttribute attrib in node.Attributes)
str.AppendFormat(" Атрибут: {0} Значение: {1} \n",attrib.Name, attrib.Value)
}
if (node.HasChildNodes)
{
str.Append(ReadXML(node.ChildNodes));
}
return str.ToString();
}