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);
}
} //Конец функции
} //Конец класса
Листинг 10.2. Вызов кода, предназначенного для сохранения и загрузки XML-документаprivate void button1_Click{object sender, System.EventArgs e) {
const string FILENAME = "TestFileName.XML";
//Сохранить, используя XML DOM
SaveAndLoadXML UseDOM.XML_SaveUserInfo(FILENAME, 14, "Ivo", "Salmre");
//Сохранить, используя объект однонаправленной записи XMLWriter
//SaveAndLoadXML_UseReaderWriter.XML SaveUserInfo(FILENAME,
// 18, "Ivo", "Salmre");
int userID;
string firstName;
string lastName;
//Загрузить, используя XML DOM
SaveAndLoadXML_UseDOM.XML_LoadUserInfo(FILENAME, out userID, out firstName, out lastName);
//Загрузить, используя объект однонаправленного чтения XMLReader
//SaveAndLoadXML_UseReaderWriter.XMILoadUserInfo(FILENAME,
// out userID, out firstName, out lastName);
System.Windows.Forms.MessageBox.Show('Готово!" + userID.ToString() + ", " + lastName + ", " + firstName);
}
Модель однонаправленного чтения-записи XML-данных
В отличие от подхода XML DOM, обеспечивающего произвольный доступ к XML-данным и интенсивно использующего информацию о состоянии, объекты XMLReader и XMLWriter обеспечивают лишь возможности однонаправленного доступа. Они поддерживают минимальный объем информации о состоянии, которого достаточно для чтения и записи XML-данных, и не пытаются создавать в памяти дерево XML-данных или работать с ним. В этом случае говорят о моделях однонаправленного доступа, поскольку они поддерживают программный курсор, указывающий на текущую позицию в XML-файле, и позволяют работать только с находящимися в этом месте данными; курсор может перемещаться только в прямом направлении, но не в обратном. Объект XMLReader предлагает много возможностей, но в приложениях используется в основном для прохождения узлов XML-документа. При чтении XML-документа XMLReader каждый раз считывает только один узел и связанные с ним атрибуты; это напоминает чтение обычного файла по одной строке за один раз. Когда разработчик заканчивает просмотр узла и его атрибутов, он отдает объекту XMLReader команду перейти к следующему элементу, в результате чего XMLReader сбрасывает содержащуюся в нем информацию, которая относится к содержимому текущего узла. Однонаправленность доступа является необходимой платой за достижение наилучшей производительности и снижение накладных расходов.