
- •Язык xml
- •Пространства имён
- •Объектная модель xml документа
- •Перечисление XmlNodeType
- •Класс XmlDocument
- •Использование объектной модели документа
- •Запись xml документа
- •Чтение xml документа
- •Последовательный доступ к xml документу
- •Класс XmlTextWriter
- •Класс XmlTextReader
- •Сериализация (Serialization)
- •Класс из графа объектов
- •Сериализация с помощью XmlSerializer
- •Пример сериализации
- •Результат сериализации
- •Пример десериализации
- •Управление генерируемым xml
- •Использование атрибутов
- •Результат сериализации
- •Использование атрибутов сериализации
- •Сериализация коллекций
- •Десериализация коллекции
Последовательный доступ к xml документу
Последовательный доступ к XML документам позволяет читать и записывать их наиболее эффективно. Недостатками использования этого подхода являются то, что во-первых доступ осуществляется линейно, а во-вторых во время работы с документом файл остаётся открытым.
Класс XmlTextWriter
Класс XmlTextWriter предоставляет средство для быстрой прямой записи XML данных.
Создаётся экземпляр класса XmlTextWriter для записи в файл "books.xml". Задаётся форматирование с отступом. Отступ задаётся равный трём символам. Записывается объявление XML. Записывается комментарий содержащий информацию о том когда документ был создан. Записывается открывающий тег <books>. Записывается открывающий тег <book>. Записываются элементы содержащие текст <title> и <author>. Записывается открывающий тег <price>. Записывается атрибут этого тега format равный "dollars". Записывается текст. Записывается закрывающий тег </price>. Записывается открывающий тег <pubinfo>. Записываются элементы содержащие текст <publisher> и <pubdate>. Записывается закрывающий тег </pubinfo>. Записывается закрывающий тег </book>. Записывается закрывающий тег </books>. Последние три закрывающих тега можно было записать одним вызовом WriteEndDocument. Закрывается экземпляр класса XmlTextWriter. При его закрытии закрывается файл.
static void Main()
{
XmlTextWriter writer = new XmlTextWriter("books.xml", null);
writer.Formatting = Formatting.Indented;
writer.Indentation = 3;
writer.WriteStartDocument();
writer.WriteComment("Создан: " + DateTime.Now.ToString());
writer.WriteStartElement("books");
writer.WriteStartElement("book");
writer.WriteElementString("title", "CLR via C#");
writer.WriteElementString("author", "Jeffrey Richter");
writer.WriteStartElement("price");
writer.WriteAttributeString("format", "dollars");
writer.WriteString("59.99");
writer.WriteEndElement();
writer.WriteStartElement("pubinfo");
writer.WriteElementString("publisher", "Microsoft Press");
writer.WriteElementString("pubdate", "22/03/2006");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
}
Класс XmlTextReader
Класс XmlTextReader предоставляет средство для быстрого прямого чтения XML данных.
Функция работает последовательно. Она по очереди используя метод Read обходит все узлы и обрабатывает их. Для каждого узла определяется тип. В зависимости от типа узла получается разная информация об узле. Информация записывается в изменяемую строку символов. После определения типа узла и получения информации об узле проверяется есть ли у узла атрибуты. Если у узла есть атрибуты то информация о каждом из них записывается в изменяемую строку. Обход всех атрибутов осуществляется последовательно с помощью функции MoveToNextAttribute. В конце получившаяся изменяемая строка выводится на экран.
static void Main()
{
XmlTextReader reader = new XmlTextReader("books.xml");
StringBuilder str = new StringBuilder();
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.XmlDeclaration:
str.AppendFormat("Объявление XML : {0} {1} \n", reader.Name,reader.Value);
break;
case XmlNodeType.Element:
str.AppendFormat("Элемент: {0} \n",reader.Name); break;
case XmlNodeType.Text:
str.AppendFormat(" Значение: {0} \n",reader.Value); break;
case XmlNodeType.Comment:
str.AppendFormat("Комментарий: {0} \n“,reader.Value); break;
...
}
if (reader.AttributeCount > 0)
{
while (reader.MoveToNextAttribute())
str.AppendFormat(" Атрибут: {0} Значение: {1} \n",reader.Name, reader.Value);
}
reader.Close();
Console.WriteLine(str);
}
}