Шрифт:
//
// [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;
}
//-------------------------------------------------------------
//Вызывается, когда встречается конец
//элемента
//
//Мы можем захотеть переключить состояние в зависимости от вида
//покидаемого узла, чтобы указать на то, что собираемся
//вернуться назад к его предку
//-------------------------------------------------------------
case System.Xml.XmlNodeType.EndElement: {
bool continueParsing;
continueParsing = LoadHelper_EndElementEncountered(ref currentReadLocation);
if (continueParsing ==false) {
goto finished_reading_wanted_data;
}
break;