Книга: Программирование мобильных устройств на платформе .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);
}
} //Конец функции
} //Конец класса
- Соображения, побуждающие к использованию подхода, основанного на модели XML DOM
- Соображения, побуждающие избегать использования подхода, основанного на модели XML DOM
- Листинг 10.1. Использование XML DOM для сохранения данных в файле и их загрузки
- Листинг 10.2. Вызов кода, предназначенного для сохранения и загрузки XML-документа
- XML DOM
- Соображения, побуждающие к использованию подхода, основанного на модели XML DOM
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление с использованием инструмента gbak
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.
- Перевод базы данных InterBase 6.x на 3-й диалект
- Типы данных для работы с датой и временем