Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре

Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре

Читать онлайн Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 79 80 81 82 83 84 85 86 87 ... 206
Перейти на страницу:

Создание дерева объектов в памяти является удобным способом работы с данными среднего объема, которые требуется всего лишь последовательно обновлять. XML-файл размером 20 Кбайт можно довольно быстро загрузить в память и после работы с ним в памяти как с деревом объектов вновь сохранить в файловой системе. Коль скоро объемы интересующих нас данных невелики, модель XML DOM предоставляет отличные возможности для создания XML-документов, обработки их в памяти и вывода XML-данных в файл или сетевой поток.

Применимость DOM-подхода ограничивается как объемом памяти, доступной для размещения сгенерированного анализатором дерева объектов, так и наличием резервов вычислительной мощности, необходимых для разбора всего дерева XML-данных. Недостатком подхода, основанного на XML DOM, является его монолитность; прежде чем вы сможете получить доступ к XML-данным, вы должны выполнить синтаксический анализ документа и разместить в памяти все содержимое файла или потока. Если вам необходимо работать лишь с небольшим объемом данных, содержащихся в файле большого размера, то доступ к этим данным будет сопряжен с большими накладными расходами.

Соображения, побуждающие к использованию подхода, основанного на модели XML DOM 

■ XML DOM — простая и вместе с тем предлагающая богатые возможности программная модель. Представление XML-документа деревом объектов, хранящимся в памяти, упрощает работу с данными, к которым требуется произвольный доступ. 

■ XML DOM отлично подходит для работы с данными небольшого или среднего объема. Коль скоро файл данных имеет достаточно небольшие размеры, его содержимое не займет слишком много места в памяти. 

■ XML DOM — наилучший выбор, если необходимо работать (имея возможность вносить изменения) сразу со всеми находящимися в памяти XML-данными. XML DOM является чрезвычайно мощным инструментом, если вашему приложению необходимо работать с данными в режиме произвольного доступа, а данные после их обработки должны быть заново сохранены в файле на диске или потоке.

Соображения, побуждающие избегать использования подхода, основанного на модели XML DOM 

■ Модель программирования XML DOM вынуждает вас выполнять синтаксический анализ и загрузку XML-данных в дерево объектов, хранящееся в памяти, прежде чем вы сможете получить к ним доступ. Слишком расточительно создавать в памяти крупное по размерам дерево всего документа, если вашему приложению требуется доступ лишь к небольшой части входящих в него XML-данных. 

■ Использование модели XML DOM приведет к постепенному снижению производительности по мере роста размеров XML-документов. Поскольку в случае крупных файлов многие объекты будут создаваться в условиях ограниченных ресурсов памяти устройства, это иногда может стать причиной нехватки памяти. Кроме того, все созданные объекты впоследствии должны быть удалены из памяти сборщиком мусора, что обременит ваше приложение дополнительными накладными расходами. 

■ Не стоит останавливать свой выбор на XML DOM, если данные будут использоваться только в режиме чтения. DOM привносит дополнительные накладные расходы, но упрощает обратную запись данных из памяти на носитель. Если данные будут использоваться только в режиме чтения или вы планируете записывать их в другом формате, то потеряете в производительности, ничего не получая взамен.

В листинге 10.1 содержится пример кода, предназначенного для чтения и записи представленных выше XML-данных с использованием модели 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);

  //---------------------------------------------

1 ... 79 80 81 82 83 84 85 86 87 ... 206
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре.
Комментарии