Выбрать главу

using System;

public class SaveAndLoadXML UseReaderWriter {

 //XML-дескрипторы, которые мы будем использовать в своем документе

 const string XML_ROOT_TAG = "AllMyData";

 const string XML_USERINFO_TAG = "UserInfo";

 const string XMI_USERID_TAG = "UserID";

 const string XML_NAMEINFO_TAG = "Name";

 const string XML_FIRSTNAME_TAG = "FirstName";

 const string XML_LASTNAME TAG = "LastName";

 //Набор состояний, отслеживаемых по мере чтения данных

 private enum ReadLocation {

  inAllMyData,

  inUserInfo,

  inUserID,

  inName,

  inFirstName,

  inLastName,

 }

 //--------------------------------------------------------------------

 //Сохраняет пользовательское состояние

 //

 // [in] fileName: Имя файла, используемого для сохранения данных

 // [in] userId: Идентификатор пользователя, который мы хотим сохранить

 // [in] firstName: Имя пользователя, которое мы хотим сохранить

 // [in] lastName: Фамилия пользователя, которую мы хотим сохранить

 //--------------------------------------------------------------------

 public static void XML_SaveUserInfo(string fileName, int userId,string firstName, string lastName) {

  System.Xml.XmlTextWriter xmlTextWriter;

  xmlTextWriter =new System.Xml.XmlTextWriter(fileName, System.Text.Encoding.Default);

  //Записать содержимое документа!

  //<Root>

  xmlTextWriter.WriteStartElement(XML_ROOT_TAG);

  //<Root>

  xmlTextWriter.WriteStartElement(XML_USERINFO_TAG);

  //<Root><UserID>

  //<Root><UserInfo>

  xmlTextWriter.WriteStartElement(XML_NAMEINFO_TAG);

  //<Root><UserInfo><Name>

  xmlTextWriter.WriteStartElement(XML_FIRSTNAME_TAG);

  //<Root><UserInfo><Name><FirstName>

  xmlTextWriter.WriteString(firstName); //Запись значения

  xmlTextWriter.WriteEndElement(); //Закрыть дескриптор имени

  //<Root><UserInfo><Name>

  xmlTextWriter.WriteStartElement(XML_LASTNAME_TAG);

  //<Root><UserInfo><Name><LastName>

  xmlTextWriter.WriteString(lastName); //Запись значения

  xmlTextWriter.WriteEndElement(); //Закрыть дескриптор фамилии

  //<Root><UserInfo><Name>

  xmlTextWriter.WriteEndElement(); //Закрыть дескриптор ФИО

  //<Root><UserInfo>

  //<Root><UserInfo>

  xmlTextWriter.WriteStartElement(XML_USERID_TAG);

  //<Root><UserInfo><UserID>

  //Запись значения

  xmlTextWriter.WriteString(userId.ToString());

  xmlTextWriter.WriteEndElement();

  //Закрыть дескриптор UserID

  //<Root><Userlnfo>

  xmlTextWriter.WriteEndElement(); //Закрыть дескриптор UserInfo

  //<Root>

  xmlTextWriter.WriteEndElement(); //Закрыть дескриптор документа

  //

  xmlTextWriter.Close();

 }

 //--------------------------------------------------------------

 //Загружает пользовательское состояние

 //

 // [in] fileName: Имя файла, используемого для сохранения данных

 // [out] userId: Загруженный идентификатор пользователя

 // [out] firstName: Загруженное имя пользователя

 // [out] lastName: Загруженная фамилия пользователя

 //--------------------------------------------------------------

 public static void XML_LoadUserInfo(string fileName, out int userId, out string firstName,out string lastName) {

  ReadLocation currentReadLocation;

  //Начинаем с нулевых значений

  userId = 0;

  firstName = "";

  lastName = "";

  System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(fileName);

  xmlReader.WhitespaceHandling = System.Xml.WhitespaceHandling.None;

  bool readSuccess;

  readSuccess = xmlReader.Read();

  if (readSuccess == false) {

   throw new System.Exception("Отсутствуют XML-данные для чтения!");

  }

  //Убедиться в том, что мы распознали корневой дескриптор

  if (xmlReader.Name != XML_ROOT_TAG) {

   throw new System.Exception("Корневой дескриптор отличается от ожидаемого!");

  }

  //Отметить текущее местоположение в документе

  currentReadLocation = ReadLocation.inAllMyData;

  //------------------------------------------------------

  //Цикл прохождения документа и чтение необходимых данных

  //------------------------------------------------------

  while (readSuccess) {

   switch (xmlReader.NodeType) {

   //Вызывается при входе в новый элемент

   case System.Xml.XmlNodeType.Element: {

    string nodeName = xmlReader.Name;

    LoadHelper_NewElementEncountered(nodeName, ref currentReadLocation);

    break;

   }

   //----------------------------------------------------

   //Здесь мы можем извлечь некоторый фактический текст и

   //получить данные, которые пытаемся загрузить

   //----------------------------------------------------

   case System.Xml.XmlNodeType.Text: {

    switch (currentReadLocation) {

    case ReadLocation.inFirstName: {

     firstName = xmlReader.Value;

     break;

    }

    case ReadLocation.inLastName: {

     lastName = xmlReader.Value;

     break;

    }

    case ReadLocation.inUserID: {

     userId = System.Convert.ToInt32(xmlReader.Value);

     break;

    }

    }

    break;