Шрифт:
}
default: {
//He страшно, если имеются XML-узлы других типов, но
//в нашем примере работы с XML-документом мы должны
//оповестить об этом факте...
System.Windows.Forms.MessageBox.Show("Встретился непредвиденный XML-тип " + xmlReader.Name);
break;
}
} //Конец оператора Case, используемого для определения текущего
//типа XML-элeмeнтa, oбpaбaтывaeмoгo анализатором
//Перейти к следующему узлу
readSuccess = xmlReader.Read;
}
//Если мы оказались в этом месте программы, не покинув
//XML-дескриптора UserInfo, то с XML-данными, которые
//мы считываем, что-то не так
throw new Exception("He найден элемент UserInfo в XML-документе!");
finished_reading_wanted_data:
//Закрыть файл, поскольку работа с ним закончена!
xmlReader.Close;
}
//--------------------------------------------------------
//Вспомогательный код, ответственный за принятие решения
//относительно того, в какое состояние необходимо перейти,
//когда встречается закрывающий дескриптор
//--------------------------------------------------------
private static bool LoadHelper_EndElementEncountered(ref ReadLocation currentReadLocation) {
switch (currentReadLocation) {
//Если мы покидаем узел Name, то должны вернуться
//обратно в узел UserInfo
case ReadLocation.inName: {
currentReadLocation = ReadLocation.inUserInfo;
break;
}
//Если мы покидаем узел FirstName, то должны вернуться
//обратно в узел Name
case ReadLocation.inFirstName: {
currentReadLocation = ReadLocation.inName;
break;
}
//Если мы покидаем узел LastName, то должны вернуться
//обратно в узел Name
case ReadLocation.inLastName: {
currentReadLocation = ReadLocation.inName;
break;
}
//Если мы покидаем узел UserID, то должны вернуться
//обратно в узел UserInfo
case ReadLocation.inUserID: {
currentReadLocation = ReadLocation.inUserInfo;
break;
}
//Если мы покидаем узел UserInfo, то мы только что
//закончили чтение данных в узлах UserID, FirstName
//и LastName.
//
//Можно выйти из цикла, поскольку у нас уже есть вся
//информация, которую мы хотели получить!
case ReadLocation.inUserInfo: {
return false; //Анализ должен быть прекращен
}
}
return true; //Продолжить анализ
}
private static void LoadHelper_NewElementEncountered(string nodeName,ref ReadLocation currentReadLocation) {
//------------------------------------------------------
//Мы вошли в новый элемент!
//
//B какое состояние переход возможен, зависит от того, в
//каком состоянии мы находимся в данный момент
//------------------------------------------------------
switch (currentReadLocation) {
//Если мы находимся в узле AllMyData, то переход возможен