Выбрать главу

        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 сбрасывает содержащуюся в нем информацию, которая относится к содержимому текущего узла. Однонаправленность доступа является необходимой платой за достижение наилучшей производительности и снижение накладных расходов.