Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Последовательный доступ к 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);

}

}

Сериализация (Serialization)

Сериализация – это процесс записи состояния объекта в поток. Сохранённая последовательность данных содержит всю необходимую информацию для восстановления состояния объекта в случае необходимости.

С помощью сериализация можно организовать копирование объектов на удалённные машины. По этой причине она широко применяется при вызове удалённых методов и в веб сервисах.



В C# для того чтобы объекты класса могли быть сериализованы достаточно просто связать с ним атрибут [Serializable].Если какие-то поля класса не должны быть сериализованны необходимо связать с ними атрибут [NonSerialized].

Сериализуемый объект может ссылаться на другие объекты, которые могут ссылаться на другие объекты и так далее. Все такие объекты вместе называются графом связанных объектов. Когда объект сериализуется вместе с ним сериализуется весь граф связанных объектов.

Для различных видов графов связанных объектов возможны различные алгоритмы сериализации. Например, некоторые алгоритмы которые отлично работают с графами связанных объектов деревьями не будут работать с графами связанных объектов содержащими циклы.

Рисунок – Граф связанных объектовэ

Экземпляр класса ArrayList ссылается на два различных экземпляра класса Book. Каждый из экземпляров класса Book ссылается на свой экземпляр класса Pubinfo. В данном случае граф не содержит циклов и вообще представляет из себя дерево. Несложно привести пример, где граф связанных объектов содержит циклы и не является деревом.

Класс из графа объектов

Для демонстрации графа объектов объявляется класс Pubinfo. Он будет использоваться для объявления поля в другом классе Book. В нём всего два поля для издательства и издания. Для простоты они объявлены публичными. В классе объявлен конструктор позволяющий задавать значения этих двух полей. У класса есть атрибут [Serializable]. Без этого атрибута класс не был бы сериализуемым.

[Serializable]

public class Pubinfo

{

public string publisher;

public int edition;

 

public Pubinfo(){}

public Pubinfo(string publisher, int edition)

{

this.publisher = publisher; this.edition = edition;

}

}

Для демонстрации графа объектов объявляется класс Book. В нём всего три поля два для автора и названия, а третье для информации об издательстве и издании. Для простоты все поля объявлены публичными. В классе объявлен конструктор позволяющий задавать значения полей для автора и названия а также издательство и издание. При создании экземпляра класса Book в конструкторе создаётся экземпляр класса Pubinfo и ссылка на него записывается в поле для информации об издательстве и издании. У класса есть атрибут [Serializable]. Этот атрибут необходим чтобы класс был сериализуемым.

[Serializable]

public class Book

{

public string author;

public string title;

public Pubinfo info;

public Book() { }

public Book(string author, string title, string publisher, int edition)

{

this.author = author; this.title = title;

info = new Pubinfo(publisher, edition);

}

public override string ToString()

{

return String.Format("Автор : {0} \nНазвание : {1} \nИздательство : {2}

\nИздание : {3}", author, title, info.publisher, info.edition);

}

}

Приведён код программы строящей граф объектов. Создаются несколько объектов класса Book с различными значениями полей. При создании экземпляров класса Book в конструкторе создаются экземпляры класса Pubinfo. Все созданные экземпляры класса Book помещаются в один динамический массив. Получается граф объектов. Данный граф объектов является деревом. Корень этого дерева объект для динамического массива. Его потомки это экземпляры класса Book. У каждого экземпляра класса Book есть свой потомок это экземпляр класса Pubinfo.

class Program

{

static void Main()

{

ArrayList books = new ArrayList();

Book book = new Book("Richter", ".NET Framework", "Microsoft Press",2);

books.Add(book);

Book anotherbook = new Book("Richter", "CLR via C#", "Microsoft Press", 1);

books.Add(anotherbook);

...

}

}


Эта страница нарушает авторские права

allrefrs.ru - 2019 год. Все права принадлежат их авторам!