Книга: Программирование мобильных устройств на платформе .NET Compact Framework

Листинг 10.1. Использование XML DOM для сохранения данных в файле и их загрузки

Листинг 10.1. Использование XML DOM для сохранения данных в файле и их загрузки

using System;
//----------------------------------------------
//Демонстрирует сохранение и загрузку файлов с
//использованием объектной модели документов XML
//----------------------------------------------
public class SaveAndLoadXML_UseDOM {
 //XML-дескрипторы, которые мы будем использовать в нашем документе
 const string XML_ROOT_TAG = "AllMyData";
 const string XML_USERINFO_TAG = "UserInfo";
 const string XML_USERID_TAG = "UserID";
 const string XML_NAMEINFO_TAG = "Name";
 const string XML_FIRSTNAME_TAG = "FirstName";
 const string XML_LASTNAME_TAG = "LastName";
 //--------------------------------------------------------------
 //Загружает пользовательское состояние
 //
 // [in] fileName: Имя файла, используемого для сохранения данных
 // [out] userId: Загруженный идентификатор пользователя
 // [out] firstName: Загруженное имя пользователя
 // [out] lastName: Загруженная фамилия пользователя
 //--------------------------------------------------------------
 public static void XML_LoadUserInfo(string fileName, out int userId, out string firstName, out string lastName) {
  //Начинаем с нулевых значений
  userId = 0;
  firstName = "";
  lastName = "";
  //Предполагаем, что данные еще не загружены
  bool gotUserInfoData = false;
  System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
  xmlDocument.Load(fileName);
  //Получить корневой узел
  System.Xml.XmlElement rootElement;
  rootElement = (System.Xml.XmlElement)xmlDocument.ChildNodes[0];
  //Убедиться в том, что корневой узел согласуется с ожидаемым текстом,
  //ибо противное означает, что мы имеем дело с каким-то другим XML-файлом
  if (rootElement.Name != XML_ROOT_TAG) {
   throw new Exception("Тип корневого узла не совпадает с ожидаемым!");
  }
  //-----------------------------------------------------------
  //Простой конечный автомат для итеративного обхода всех узлов
  //-----------------------------------------------------------
  foreach(System.Xml.XmlElement childOf_RootNode in rootElement.ChildNodes) {
   //Если это узел UserInfo, то мы хотим просмотреть его содержимое
   if (childOf_RootNode.Name == XML_USERINFO_TAG) {
    gotUserInfoData = true; //Пользовательские данные найдены
    //--------------------------------
    //Загрузить каждый из подэлементов
    //--------------------------------
    foreach(System.Xml.XmlElement child_UserDataNode in childOf_RootNode.ChildNodes) {
     //Идентификатор пользователя (UserID)
     if (child_UserDataNode.Name == XML_USERID_TAG) {
      userId = System.Convert.ToInt32(child_UserDataNode.InnerText);
     }
     //ФИО пользователя (UserName)
     else if (child_UserDataNode.Name == XML_NAMEINFO_TAG) {
      foreach(System.Xml.XmlElement child_Name in child_UserDataNode.ChildNodes) {
       //Имя (FirstName)
       if (child_Name.Name == XML_FIRSTNAME_TAG) {
        firstName = child_Name.InnerText;
 

       }
       //Фамилия (LastName)
       else if (child_Name.Name == XML_LASTNAME_TAG) {
        lastName = child_Name.InnerText;
       }
      }//Конец цикла разбора UserName
     }//Конец оператора if, осуществляющего проверку UserName
    }//Конец цикла разбора UserInfo
   }// Конец оператора if, осуществляющего проверку UserInfo
  }//Конец цикла разбора корневого узла
  if (gotUserInfoData == false) {
   throw new Exception ("Данные пользователя в XML-документе не найдены!");
  }
 }
 //------------------------------------------------------------------
 //Сохраняет пользовательское состояние
 //
 // [in] fileName: Имя файла, используемого для сохранения данных
 // [in] userId:Идентификатор пользователя, которыймы хотим сохранить
 // [in] firstName: Имя пользователя, которое мы хотим сохранить
 // [in] lastName: Фамилия пользователя, которую мы хотим сохранить
 //------------------------------------------------------------------
 public static void XML_SaveUserInfo(string fileName, int userId, string firstName, string lastName) {
  System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
  //-----------------------------------------
  //Добавить элемент документа высшего уровня
  //-----------------------------------------
  System.Xml.XmlElement rootNodeForDocument;
  rootNodeForDocument = xmlDocument.CreateElement(XML_ROOT_TAG);
  xmlDocument.AppendChild(rootNodeForDocument);
  //----------------------------------
  //Добавить данные в элемент UserInfo
  //----------------------------------
  System.Xml.XmlElement topNodeForUserData;
  topNodeForUserData = xmlDocument.CreateElement(XML_USERINFO_TAG);
  rootNodeForDocument.AppendChild(topNodeForUserData);
  //---------------------------------------
  //Добавить значение UserID в наш документ
  //---------------------------------------
  //Создать подузел для информации о пространстве имен
  System.Xml.XmlElement subNodeForUserID;
  subNodeForUserID = xmlDocument.CreateElement(XML_USERID_TAG);
  subNodeForUserID.InnerText = System.Convert.ToString(userId);
  //Присоединить подузел UserID к узлу высшего уровня
  topNodeForUserData.AppendChild(subNodeForUserID);
  //---------------------------------------------
  //Добавить все значения NameInfo в наш документ
  //---------------------------------------------
  //Создать подузел для информации о пространстве имен
  System.Xml.XmlElement subNodeForNameInfo;
  subNodeForNameInfo = xmlDocument.CreateElement(XML_NAMEINFO_TAG);
  //Имя (FirstName)
  System.Xml.XmlElement subNodeFirstName;
  subNodeFirstName = xmlDocument.CreateElement(XML_FIRSTNAME_TAG);
  subNodeFirstName.InnerText = firstName;
  //Фамилия (LastName)
  System.Xml.XmlElement subNodeLastName;
  subNodeLastName = xmlDocument.CreateElement(XML_LASTNAME_TAG);
  subNodeLastName.InnerText = lastName;
  //Присоединить подузлы имени и фамилии к родительскому
  //узлу NameInfo
  subNodeForNameInfo.AppendChild(subNodeFirstName);
  subNodeForNameInfo.AppendChild(subNodeLastName);
  //Присоединить подузел NameInfo (вместе с его дочерними узлами)
  //к узлу высшего уровня
  topNodeForUserData.AppendChild(subNodeForNameInfo);
  //------------------
  //Сохранить документ
  //------------------
  try {
   xmlDocument.Save(fileName);
  }
  catch (System.Exception ex) {
   System.Windows.Forms.MessageBox.Show("Ошибка при сохранении XML-документа - " + ex.Message);
  }
 } //Конец функции
} //Конец класса

Оглавление книги


Генерация: 1.480. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз