Разработка приложений для мобильных устройств на платформе Windows Mobile

Применение XML при разработке мобильного приложения

Разбить на страницы
Показывать лекцию целиком

Целью данной лабораторной работы является знакомство с языком XML и возможностями его применения в разработке мобильных приложений.

Задание на лабораторную работу

  • Изучить теоретические основы работы с XML - данными
  • Реализовать алгоритм записи и чтения данных их XML - документа, основанный на модели XML DOM.
  • Реализовать алгоритм записи и чтения данных их XML - документа, основанный на однонаправленном чтении - записи данных.
  • Язык разметки документов - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка, или, как их иногда называют, управляющие дескрипторы, в таких документах каким-то образом кодируются, выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. В самых первых системах для обозначения этих команд использовались символы "<" и ">", внутри которых помещались названия инструкций и их параметры. Сейчас такой способ обозначения тэгов является стандартным.

    Использование гипертекстовой разбивки текстового документа в современных информационных системах во многом связано с тем, что гипертекст позволяет создавать механизм нелинейного просмотра информации. В таких системах данные представляются не в виде непрерывного потока текстовой информации, а набором взаимосвязанных компонентов, переход по которым осуществляется при помощи гиперссылок.

    XML ( Extensible Markup Language ) - это язык разметки, описывающий целый класс объектов данных, называемых XML- документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он просто определяет порядок их создания.

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

    Достоинства XML

  • XML - язык разметки, позволяющий отобразить двоичные данные в текст, читаемый человеком и анализируемый компьютером;
  • XML поддерживает Юникод;
  • в формате XML могут быть описаны такие структуры данных как записи, списки и деревья;
  • XML - это самодокументируемый формат, который описывает структуру и имена полей так же как и значения полей;
  • XML имеет строго определённый синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым. Одновременно с этим, разные разработчики не ограничены в выборе экспрессивных методов (например, можно моделировать данные, помещая значения в параметры тегов или в тело тегов, можно использовать различные языки и нотации для именования тегов и т. д.);
  • XML - формат, основанный на международных стандартах;
  • Иерархическая структура XML подходит для описания практически любых типов документов, кроме аудио и видео мультимедийных потоков, растровых изображений, сетевых структур данных и двоичных данных;
  • XML представляет собой простой текст, свободный от лицензирования и каких-либо ограничений;
  • XML не зависит от платформы;
  • XML является подмножеством SGML (который используется с 1986 года). Уже накоплен большой опыт работы с языком и созданы специализированные приложения;
  • XML не накладывает требований на расположение символов в строке;[http://ru.wikipedia.org/wiki/XML#cite_note-json-1]
  • В отличие от бинарных форматов, XML содержит метаданные об именах, типах и классах описываемых объектов, по которым приложение может обработать документ неизвестной структуры (например, для динамического построения интерфейсов[http://ru.wikipedia.org/wiki/XML#cite_note-2]);
  • XML имеет реализации парсеров для всех современных языков программирования;[http://ru.wikipedia.org/wiki/XML#cite_note-3]
  • XML поддерживается на низком аппаратном, микропрограммном и программном уровнях в современных аппаратных решениях.[http://ru.wikipedia.org/wiki/XML#cite_note-4]
  • Недостатки XML

  • Синтаксис XML избыточен.
  • Размер XML документа существенно больше бинарного представления тех же данных. В грубых оценках величину этого фактора принимают за 1 порядок (в 10 раз).
  • Размер XML документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML) и особенно в форматах данных, оптимизированных для конкретного случая использования.
  • Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.
  • XML содержит мета-данные (об именах полей, классов, вложенности структур), и одновременно XML позиционируется как язык взаимодействия открытых систем. При передаче между системами большого количества объектов одного типа (одной структуры), передавать метаданные повторно нет смысла, хотя они содержатся в каждом экземпляре XML описания.
  • Для большого количества задач не нужна вся мощь синтаксиса XML и можно использовать значительно более простые и производительные решения.
  • Неоднозначность моделирования.
  • Нет общепринятой методологии для моделирования данных в XML, в то время как для реляционной модели и объектно-ориентированной такие средства разработаны и базируются на реляционной алгебре, системном подходе и системном анализе.
  • В природе есть множество объектов и явлений, для описания которых разные структуры данных (сетевая, реляционная, иерархическая) являются естественными, и отображение объекта в неестественную для него модель является болезненным для его сути. В случае с реляционной и иерархической моделями определены процедуры декомпозиции, обеспечивающие относительную однозначность, чего нельзя сказать о сетевой модели.
  • В результате большой гибкости языка и отсутствия строгих ограничений, одна и та же структура может быть представлена множеством способов (различными разработчиками), например, значение может быть записано как атрибут тега или как тело тега и т. д.
  • Поддержка многих языков в именовании тегов дает возможность назвать, например вес русским словом, в таком случае компьютер никак не сможет установить соответствия этого поля с полем weight в англоязычной версии программы и с полями в версиях модели объекта на множестве других языков.
  • XML не содержит встроенной в язык поддержки типов данных. В нём нет строгой типизации, то есть понятий "целых чисел", "строк", "дат", "булевых значений" и т. д.
  • Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами и сетевой моделью данных.
  • Сохранение данных в виде XML

    Как и в случае HTML, в XML данные сохраняются в виде текста, заключенного между дескрипторами, которые дополняют передаваемые данные контекстом:

    <UserInfo>
    <UserID> 12 </UserID> <UserName> Bob </UserName>
    <UserAddress> Someplace, Somewhere </UserName> </UserInfo>

    Следует отметить, что в XML те же данные можно сохранить с использованием атрибутов, например:

    <UserInfo UserID="12" UserName="Bob" UserAddress="Someplace, Somewhere"> </UserInfo>

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

    10.1. Иерархическая структура XML-данных

    Очень важно хорошо понимать иерархическую структуру XML. Представляйте себе XML-документ в виде дерева объектов, у каждого из которых могут иметься дополнительные дочерние объекты. Для демонстрации этого изменим приведенный выше пример таким образом, чтобы внести в него дополнительную иерархию:

    <UserInfo>
        <UserID> 12 </UserID> <Name>
        <FirstName>   Иво </FirstName> <LastName>   Салмре </LastName> </Name> <Address>
    <Street>10 НекаяУлица</5сгеег.> <City>Cn3^</City> <State>WA</State> </Address> </UserInfo>

    Здесь мы сделали узлы Name и Address подузлами Userlnfо.

    Что касается практического использования, то в большинстве случаем XML-данные, участвующие в обмене, попадают в промежуток между двумя крайними категориями: строго структурированными данными и данными свободной формы. Какой уровень строгости следует применять к форматам данных, решают совместно как отправитель, так и получатель данных. Вычислительный узел, генерирующий XML-документы, может придерживаться строго определенной схемы или же просто может выбирать ту форму XML-кодирования, которая является для него наиболее удобной. Аналогичным образом, вычислительный узел, получающий XML-документы, может либо выполнять проверку их содержимого на предмет соответствия предполагаемой схеме, либо предполагать, что данные форматированы корректно, и сразу же пытаться осуществить синтаксический анализ результатов. Поскольку такие операции, как верификация схемы, могут быть трудоемкими в вычислительном отношении, то в тех случаях, когда такая проверка нужна, лучше, чтобы она осуществлялась на сервере до передачи данных устройству.

    При работе с XML-данными вы можете использовать один из трех основных подходов:

  • Создать собственный "оптимизированный" анализатор с нуля. При наличии ранее разработанных и протестированных методик это почти никогда не стоит делать. Причина, по которой применять такой подход категорически не рекомендуется, заключается в том, что получаемые при этом преимущества лишь в редких случаях окупают усилия, затрачиваемые на разработку и последующее сопровождение соответствующих программ.
  • Использовать высокоуровневые универсальные методы синтаксического анализа с произвольным, доступом, основанные на модели XML DOM. DOM (Document Object Model- объектная модель документов) обеспечивает возможность работы с XML-данными, хранящимися в памяти в виде иерархического дерева объектов. В результате использования высокоуровневого API-интерфейса для работы с XML вы получаете в высшей степени надежный код, удобный в сопровождении. Такой подход является оптимальным для небольших XML-документов, а также документов, при работе с которыми требуется постоянный произвольный доступ ко всем частям дерева XML-документа, или документов, которые должны быть заново целиком сохранены в файле на диске.
  • Использовать низкоуровневый API-интерфейс XML, обеспечивающий выполнение лишь одштаправленпых операций чтения-записи данных. Применение низкоуровневых API-интерфейсов позволяет максимально повысить производительность, но возлагает дополнительную нагрузку на программистов. Эти API-интерфейсы поддерживают выполнение операций чтения-записи данных только в прямом направлении и позволяют считывать или записывать данные XML-дерева в виде потока XML-элементов без сохранения всего документа в памяти. В случае мобильных устройств, для которых память всегда является дефицитным ресурсом, и особенно при работе с большими объемами данных или данными, предназначенными только для чтения, только такой подход и обеспечивает достижение приемлемой производительности. Он представляет собой хорошую основу, являющуюся промежуточной между использованием высокоуровневых АР1-интер(рейсов и развертыванием собственной методики. Такой путь является разумным, если привлечение высокоуровневых API-интерфейсов для удовлетворения ваших нужд требует интенсивных дополнительных вычислений и приводит к чрезмерному расходу памяти.
  • Более подробно рассмотрим второй и третий варианты работы с XML - данными

    XML DOM

    DOM (от англ. Document Object Model - "объектная модель документа") - это независящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому документов, а также изменять содержимое, структуру и оформление документов.

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

    Изначально различные браузеры имели собственные модели документов (DOM), не совместимые с остальными. Для того, чтобы обеспечить взаимную и обратную совместимость, специалисты международного консорциума W3C классифицировали эту модель по уровням, для каждого из которых была создана своя спецификация. Все эти спецификации объединены в общую группу, носящую название W3C DOM.

    Объектная модель XML-документа, или DOM (Document Object Model) состоит из группы программных объектов, представляющих различные компоненты XML-документа. Свойства и методы этих объектов позволяют использовать сценарии для отображения XML-документа с HTML-страницы. DOM хранит данные в древообразной структуре, отражающей иерархическую структуру XML-документа, и предоставляет доступ к любым компонентам XML-документа, включая элементы, атрибуты, инструкции по обработке, комментарии и объявления нотаций и примитивов.

    Чтобы получить доступ к XML-документу с использованием DOM, вы должны связать XML-документ с HTML-страницей. На HTML-странице это можно сделать через так называемый фрагмент данных:

    <XML ID="dsoDoc" SRC="Sample.xml"></XML>

    Идентификатор ID, который вы назначаете фрагменту данных, указывает на DSO (Data Source Object) документа. Свойство объекта DSO "XMLDocument" содержит корневой объект DOM, называемый также "узел документа". Вы можете использовать это свойство для доступа к DOM в сценариях:

    xmlDOM_Document = dsoDoc.XMLDocument;

    Полный перечень свойств, методов и событий объекта DSO документа вы можете получить в MSDN, воспользовавшись, например, поиском по словосочетанию "xml Object". Если вы хотите иметь доступ к нескольким XML-документам с HTML-страницы, вы можете поместить фрагмент данных для каждого из них. Кроме того, вы можете включить несколько фрагментов данных для одного XML-документа. Последний приём может оказаться полезным для поддержки нескольких различных версий данных XML, если ваша страница модифицирует эти данные.

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

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

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

    using System;
    //	
    //Демонстрирует сохранение и загрузку файлов с
    //использованием объектной модели документов ХМЪ
    //	
    public class SaveAndLoadXML_UseDOM {
    //XML-дескрипторы, которые мы будем использовать в нашем документе
    const string XML_R00T_TAG = "AllMyData";
    const string XML_USERINFO_TAG = "Userlnfo";
    const string XML_USERID_TAG = "UserlD";
    const string XML_NAMEINF0_TAG = "Name";
    const string XML_FIRSTNAME_TAG = "FirstName";
    const string XML_LASTNAME_TAG = "LastName";
    //	
    //Загружает пользовательское состояние //
    // [in] fileName:     Имя файла, используемого для сохранения данных
    // [out] userld:       Загруженный идентификатор пользователя
    // [out] firstName: Загруженное имя пользователя
    // [out] lastName:   Загруженная фамилия пользователя
    //	
    public static void XML_LoadUserInfo(string fileName,
    out int userld, out string firstName, out string lastName)
    {
    //Начинаем с нулевых значений userld = 0; firstName = ""; lastName = ,,n;
    //Предполагаем, что данные еще не загружены bool gotUserlnfoData = 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_R00T_TAG) {
    throw new Exception("Тип корневого узла не совпадает с ожидаемым!");
    }
    //	
    //Простой конечный автомат для итеративного обхода всех узлов
    //	
    foreach(System.Xml.XmlElement childOf_RootNode in rootElement.ChildNodes)
    {
    //Если это узел Userlnfo, то мы хотим просмотреть его содержимое
    if(childOf_RootNode.Name = XML_USERINFO_TAG)
    I
    gotUserlnfoData   = true; //Пользовательские данные найдены
    //	
    //Загрузить каждый из подэлементов
    //	
    foreach(System.Xml.XmlElement child_UserDataNode in childOf_RootNode.ChildNodes)
    {
    //Идентификатор пользователя (UserlD)
    if(child_UserDataNode.Name = XML_USERID_TAG)
    {
    userld = System.Convert.ToInt32( child_UserDataNode.InnerText);
    }
    //ФИО пользователя (UserName) else if(child UserDataNode.Name == XML NAMEINFO TAG)
    foreach(System.Xml.XmlElement child_Name in childJJserDataNode.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 }
    //Конец цикла разбора Userlnfo ) Конец оператора if, осуществляющего проверку Userlnfo }
    //Конец цикла разбора корневого узла
    if (gotUserlnfoData == false) 
    {
    throw new Exception("Данные пользователя в XML-документе не найдены!");
    }
    
    //	
    //Сохраняет пользовательское состояние //
    // [in] fileName:   Имя файла, используемого для сохранения данных
    // [in] userld:       Идентификатор пользователя, который мы хотим сохранить
    // [in] firstName: Имя пользователя, которое мы хотим сохранить
    // [in] lastName:   Фамилия пользователя, которую мы хотим сохранить
    //	
    public static void XML_SaveUserInfo(string fileName, int userld, string firstName, string lastName)
    {
    System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
    //	
    //Добавить элемент документа высшего уровня
    //	
    System.Xml.XmlElement rootNodeForDocument; rootNodeForDocument = xmlDocument.CreateElement(
    XML_R00T_TAG); xmlDocumen t.Appen dCh i1d(гооtNode For Document);
    //	
    //Добавить данные в элемент Userlnfo
    //	
    System.Xml.XmlElement topNodeForUserData; topNodeForUserData = xmlDocument.CreateElement(
    XML_USERINFO_TAG); rootNodeForDocument.AppendChild(topNodeForUserData);
    //	
    //Добавить значение UserlD в наш документ
    //	
    
    //Создать подузел для информации о пространстве имен System.Xml.XmlElement subNodeForUserlD; subNodeForUserlD =
    xmlDocument.CreateElement(XML_USERID_TAG); subNodeForUserlD.InnerText =
    System.Convert.ToString(userld);
    //Присоединить подузел UserlD к узлу высшего уровня topNodeForUserData.AppendChild(subNodeForUserlD);
    //	
    //Добавить все значения Namelnfo в наш документ
    //	
    
    //Создать подузел для информации о пространстве имен System.Xml.XmlElement subNodeForNamelnfо; 
    subNodeForNamelnfo = xmlDocument.CreateElement( XML_NAMEINFO_TAG);
    //Имя (FirstName)
    System.Xml.XmlElement subNodeFirstName; subNodeFirstName = xmlDocument.CreateElement(
    XML_FIRS TNAME_TAG); subNodeFirstName.InnerText = firstName;
    //Фамилия (LastName)
    System.Xml.XmlElement subNodeLastName; subNodeLastName = xmlDocument.CreateElement(
    XML_LASTNAME_TAG); subNodeLastName.InnerText = lastName;
    //Присоединить подузлы имени и фамилии к родительскому //узлу Namelnfo
    subNodeForNamelnfo.AppendChild(subNodeFirstName); subNodeForNamelnfo.AppendChild(subNodeLastName);
    //Присоединить подузел Namelnfo (вместе с его дочерними узлами) //к узлу высшего уровня
    topNodeForUserData.AppendChild(subNodeForNamelnfo);
    //	
    //Сохранить документ
    //	
    try
    {
    xmlDocument.Save(fileName);
    )
    catch (System.Exception ex) {
    System.Windows.Forms.MessageBox.Show(
    "Ошибка при сохранении XML-документа - " + ex.Message);
    }
    } //Конец функции } //Конец класса
    private void buttonl_Click(object sender, System.EventArgs e) 
    {
    const string FILENAME = "TestFileName.XML"; 
    //Сохранить, используя XML DOM
    SaveAndLoadXML_UseDOM.XML_SaveUserInfо(FILENAME, 14, "Ivo","Salmre");
    //Сохранить, используя объект однонаправленной записи XMLWriter
    //SaveAndLoadXML_UseReaderWriter.XML_SaveUserInfо(FILENAME,
    //	18, "Ivo", "Salmre");
    int userlD; string firstName; string lastName;
    //Загрузить, используя XML DOM
    SaveAndLoadXML_UseDOM.XML_LoadUserInfo(FILENAME, out userlD,
    out firstName, out lastName);
    //Загрузить, используя объект однонаправленного чтения XMLReader
    //SaveAndLoadXML_UseReaderWriter.XML_LoadUserInfо(FILENAME,
    //	out userlD, out firstName, out lastName);
    System.Windows.Forms.MessageBox.Show("Готово! " +userlD.ToString() + ", 
    " + lastName + ", " + firstName);

    Модель однонаправленного чтения-записи XML-данных

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

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

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

    Класс XmlTextReader обеспечивает быстрое однонаправленное чтение потока XML-данных. Данные могут быть получены из файла, объекта потока Stream или объекта TextReader. XmlTextReader обычно применяется если нужно считать XML документ и получить из него данные. Так как XmlTextReader не загружает весь документ в память, он является наилучшим выбором при обработке больших XML файлов - логов, дампов БД и пр.

    Прочитаем данные с помощью класса XmlTextReader из XML-файла, ранее. В данном случае в файле будет содержаться информация о товарах предприятия и заказах.

    OpenFileDialog dlg = new OpenFileDialog();
    dlg.Filter = "Файлы XML (*.xml)|*.xml"; if (dlg.ShowDialog() ! = DialogResult.OK)
        return; 
    
    XmlTextReader reader = null;
    orders.Clear(); 
    
    try
    {
        reader = new XmlTextReader(dlg.FileName);
        reader.WhitespaceHandling = WhitespaceHandling.None; // пропускаем пустые узлы 
    
        while (reader.Read())
            if (reader.NodeType == XmlNodeType.Element)
                if (reader.Name == "Заказ")
                {
                     Order order = new Order(reader.GetAttribute("Адрес"), 
                     DateTime.Parse(reader.GetAttribute("Дата")));  
    
                     // получаем товары в заказе
                     while (reader.Read()  reader.Name == "Товар")
                         order.AddGood(reader.GetAttribute("Название"), 
                         float.Parse(reader.GetAttribute("Цена"))); 
                     orders.Add(order);
                }
    
                ShowOrders();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Ошибка: " + ex.Message);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }

    XML-данные, которые читает XmlTextReader, берутся из файла, выбранного пользователем в диалоге. Для подавления пустых строк мы устанавливаем значение None для свойства WhitespaceHandling. Метод Read() производит чтение из потока следующего узла XML-документа. Он возвращает true если удалось считать узел. Обязательно нужно вызвать метод Read перед первым обращением к данным, т.к. в момент инициализации XmlTextReader не содержит никаких данных.

    Разработчики уделяют огромное внимание поиску реализаций алгоритма, которые позволяют добиться максимального быстродействия. А вот о том, стоит ли вообще выполнять данную работу на мобильном устройстве, они чаще всего не задумываются. Во многих случаях некоторая работа может быть выполнена еще до того, как данные поступят на устройство, или переложена на сервер и выполнена в ответ на запрос. Располагая большими объемами доступной памяти, мощными процессорами и накопителями, серверы могут с успехом выполнять значительную часть необходимой предварительной работы, а также обработку по требованию, что можно использовать с выгодой для нужд мобильных приложений.

    Лучше всего обрабатывать XML-данные на сервере еще до того, как они поступят на устройство. Если приложение ориентировано на использование данных, прошедших предварительную сортировку, фильтрацию и преобразования, то выполнение этой работы на сервере, прежде чем данные попадут на устройство, может принести вам реальные дивиденды в плане производительности. Эта задача заслуживает того, чтобы вы направили на нее часть своей творческой энергии.

    Страницы:

    Целью данной лабораторной работы является знакомство с языком XML и возможностями его применения в разработке мобильных приложений.

    Задание на лабораторную работу

  • Изучить теоретические основы работы с XML - данными
  • Реализовать алгоритм записи и чтения данных их XML - документа, основанный на модели XML DOM.
  • Реализовать алгоритм записи и чтения данных их XML - документа, основанный на однонаправленном чтении - записи данных.
  • Язык разметки документов - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка, или, как их иногда называют, управляющие дескрипторы, в таких документах каким-то образом кодируются, выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. В самых первых системах для обозначения этих команд использовались символы "<" и ">", внутри которых помещались названия инструкций и их параметры. Сейчас такой способ обозначения тэгов является стандартным.

    Использование гипертекстовой разбивки текстового документа в современных информационных системах во многом связано с тем, что гипертекст позволяет создавать механизм нелинейного просмотра информации. В таких системах данные представляются не в виде непрерывного потока текстовой информации, а набором взаимосвязанных компонентов, переход по которым осуществляется при помощи гиперссылок.

    XML ( Extensible Markup Language ) - это язык разметки, описывающий целый класс объектов данных, называемых XML- документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он просто определяет порядок их создания.

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

    Достоинства XML

  • XML - язык разметки, позволяющий отобразить двоичные данные в текст, читаемый человеком и анализируемый компьютером;
  • XML поддерживает Юникод;
  • в формате XML могут быть описаны такие структуры данных как записи, списки и деревья;
  • XML - это самодокументируемый формат, который описывает структуру и имена полей так же как и значения полей;
  • XML имеет строго определённый синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым. Одновременно с этим, разные разработчики не ограничены в выборе экспрессивных методов (например, можно моделировать данные, помещая значения в параметры тегов или в тело тегов, можно использовать различные языки и нотации для именования тегов и т. д.);
  • XML - формат, основанный на международных стандартах;
  • Иерархическая структура XML подходит для описания практически любых типов документов, кроме аудио и видео мультимедийных потоков, растровых изображений, сетевых структур данных и двоичных данных;
  • XML представляет собой простой текст, свободный от лицензирования и каких-либо ограничений;
  • XML не зависит от платформы;
  • XML является подмножеством SGML (который используется с 1986 года). Уже накоплен большой опыт работы с языком и созданы специализированные приложения;
  • XML не накладывает требований на расположение символов в строке;[http://ru.wikipedia.org/wiki/XML#cite_note-json-1]
  • В отличие от бинарных форматов, XML содержит метаданные об именах, типах и классах описываемых объектов, по которым приложение может обработать документ неизвестной структуры (например, для динамического построения интерфейсов[http://ru.wikipedia.org/wiki/XML#cite_note-2]);
  • XML имеет реализации парсеров для всех современных языков программирования;[http://ru.wikipedia.org/wiki/XML#cite_note-3]
  • XML поддерживается на низком аппаратном, микропрограммном и программном уровнях в современных аппаратных решениях.[http://ru.wikipedia.org/wiki/XML#cite_note-4]
  • Недостатки XML

  • Синтаксис XML избыточен.
  • Размер XML документа существенно больше бинарного представления тех же данных. В грубых оценках величину этого фактора принимают за 1 порядок (в 10 раз).
  • Размер XML документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML) и особенно в форматах данных, оптимизированных для конкретного случая использования.
  • Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.
  • XML содержит мета-данные (об именах полей, классов, вложенности структур), и одновременно XML позиционируется как язык взаимодействия открытых систем. При передаче между системами большого количества объектов одного типа (одной структуры), передавать метаданные повторно нет смысла, хотя они содержатся в каждом экземпляре XML описания.
  • Для большого количества задач не нужна вся мощь синтаксиса XML и можно использовать значительно более простые и производительные решения.
  • Неоднозначность моделирования.
  • Нет общепринятой методологии для моделирования данных в XML, в то время как для реляционной модели и объектно-ориентированной такие средства разработаны и базируются на реляционной алгебре, системном подходе и системном анализе.
  • В природе есть множество объектов и явлений, для описания которых разные структуры данных (сетевая, реляционная, иерархическая) являются естественными, и отображение объекта в неестественную для него модель является болезненным для его сути. В случае с реляционной и иерархической моделями определены процедуры декомпозиции, обеспечивающие относительную однозначность, чего нельзя сказать о сетевой модели.
  • В результате большой гибкости языка и отсутствия строгих ограничений, одна и та же структура может быть представлена множеством способов (различными разработчиками), например, значение может быть записано как атрибут тега или как тело тега и т. д.
  • Поддержка многих языков в именовании тегов дает возможность назвать, например вес русским словом, в таком случае компьютер никак не сможет установить соответствия этого поля с полем weight в англоязычной версии программы и с полями в версиях модели объекта на множестве других языков.
  • XML не содержит встроенной в язык поддержки типов данных. В нём нет строгой типизации, то есть понятий "целых чисел", "строк", "дат", "булевых значений" и т. д.
  • Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами и сетевой моделью данных.
  • Сохранение данных в виде XML

    Как и в случае HTML, в XML данные сохраняются в виде текста, заключенного между дескрипторами, которые дополняют передаваемые данные контекстом:

    <UserInfo>
    <UserID> 12 </UserID> <UserName> Bob </UserName>
    <UserAddress> Someplace, Somewhere </UserName> </UserInfo>

    Следует отметить, что в XML те же данные можно сохранить с использованием атрибутов, например:

    <UserInfo UserID="12" UserName="Bob" UserAddress="Someplace, Somewhere"> </UserInfo>

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

    10.1. Иерархическая структура XML-данных

    Очень важно хорошо понимать иерархическую структуру XML. Представляйте себе XML-документ в виде дерева объектов, у каждого из которых могут иметься дополнительные дочерние объекты. Для демонстрации этого изменим приведенный выше пример таким образом, чтобы внести в него дополнительную иерархию:

    <UserInfo>
        <UserID> 12 </UserID> <Name>
        <FirstName>   Иво </FirstName> <LastName>   Салмре </LastName> </Name> <Address>
    <Street>10 НекаяУлица</5сгеег.> <City>Cn3^</City> <State>WA</State> </Address> </UserInfo>

    Здесь мы сделали узлы Name и Address подузлами Userlnfо.

    Что касается практического использования, то в большинстве случаем XML-данные, участвующие в обмене, попадают в промежуток между двумя крайними категориями: строго структурированными данными и данными свободной формы. Какой уровень строгости следует применять к форматам данных, решают совместно как отправитель, так и получатель данных. Вычислительный узел, генерирующий XML-документы, может придерживаться строго определенной схемы или же просто может выбирать ту форму XML-кодирования, которая является для него наиболее удобной. Аналогичным образом, вычислительный узел, получающий XML-документы, может либо выполнять проверку их содержимого на предмет соответствия предполагаемой схеме, либо предполагать, что данные форматированы корректно, и сразу же пытаться осуществить синтаксический анализ результатов. Поскольку такие операции, как верификация схемы, могут быть трудоемкими в вычислительном отношении, то в тех случаях, когда такая проверка нужна, лучше, чтобы она осуществлялась на сервере до передачи данных устройству.

    При работе с XML-данными вы можете использовать один из трех основных подходов:

  • Создать собственный "оптимизированный" анализатор с нуля. При наличии ранее разработанных и протестированных методик это почти никогда не стоит делать. Причина, по которой применять такой подход категорически не рекомендуется, заключается в том, что получаемые при этом преимущества лишь в редких случаях окупают усилия, затрачиваемые на разработку и последующее сопровождение соответствующих программ.
  • Использовать высокоуровневые универсальные методы синтаксического анализа с произвольным, доступом, основанные на модели XML DOM. DOM (Document Object Model- объектная модель документов) обеспечивает возможность работы с XML-данными, хранящимися в памяти в виде иерархического дерева объектов. В результате использования высокоуровневого API-интерфейса для работы с XML вы получаете в высшей степени надежный код, удобный в сопровождении. Такой подход является оптимальным для небольших XML-документов, а также документов, при работе с которыми требуется постоянный произвольный доступ ко всем частям дерева XML-документа, или документов, которые должны быть заново целиком сохранены в файле на диске.
  • Использовать низкоуровневый API-интерфейс XML, обеспечивающий выполнение лишь одштаправленпых операций чтения-записи данных. Применение низкоуровневых API-интерфейсов позволяет максимально повысить производительность, но возлагает дополнительную нагрузку на программистов. Эти API-интерфейсы поддерживают выполнение операций чтения-записи данных только в прямом направлении и позволяют считывать или записывать данные XML-дерева в виде потока XML-элементов без сохранения всего документа в памяти. В случае мобильных устройств, для которых память всегда является дефицитным ресурсом, и особенно при работе с большими объемами данных или данными, предназначенными только для чтения, только такой подход и обеспечивает достижение приемлемой производительности. Он представляет собой хорошую основу, являющуюся промежуточной между использованием высокоуровневых АР1-интер(рейсов и развертыванием собственной методики. Такой путь является разумным, если привлечение высокоуровневых API-интерфейсов для удовлетворения ваших нужд требует интенсивных дополнительных вычислений и приводит к чрезмерному расходу памяти.
  • Более подробно рассмотрим второй и третий варианты работы с XML - данными

    XML DOM

    DOM (от англ. Document Object Model - "объектная модель документа") - это независящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому документов, а также изменять содержимое, структуру и оформление документов.

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

    Изначально различные браузеры имели собственные модели документов (DOM), не совместимые с остальными. Для того, чтобы обеспечить взаимную и обратную совместимость, специалисты международного консорциума W3C классифицировали эту модель по уровням, для каждого из которых была создана своя спецификация. Все эти спецификации объединены в общую группу, носящую название W3C DOM.

    Объектная модель XML-документа, или DOM (Document Object Model) состоит из группы программных объектов, представляющих различные компоненты XML-документа. Свойства и методы этих объектов позволяют использовать сценарии для отображения XML-документа с HTML-страницы. DOM хранит данные в древообразной структуре, отражающей иерархическую структуру XML-документа, и предоставляет доступ к любым компонентам XML-документа, включая элементы, атрибуты, инструкции по обработке, комментарии и объявления нотаций и примитивов.

    Чтобы получить доступ к XML-документу с использованием DOM, вы должны связать XML-документ с HTML-страницей. На HTML-странице это можно сделать через так называемый фрагмент данных:

    <XML ID="dsoDoc" SRC="Sample.xml"></XML>

    Идентификатор ID, который вы назначаете фрагменту данных, указывает на DSO (Data Source Object) документа. Свойство объекта DSO "XMLDocument" содержит корневой объект DOM, называемый также "узел документа". Вы можете использовать это свойство для доступа к DOM в сценариях:

    xmlDOM_Document = dsoDoc.XMLDocument;

    Полный перечень свойств, методов и событий объекта DSO документа вы можете получить в MSDN, воспользовавшись, например, поиском по словосочетанию "xml Object". Если вы хотите иметь доступ к нескольким XML-документам с HTML-страницы, вы можете поместить фрагмент данных для каждого из них. Кроме того, вы можете включить несколько фрагментов данных для одного XML-документа. Последний приём может оказаться полезным для поддержки нескольких различных версий данных XML, если ваша страница модифицирует эти данные.

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

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

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

    using System;
    //	
    //Демонстрирует сохранение и загрузку файлов с
    //использованием объектной модели документов ХМЪ
    //	
    public class SaveAndLoadXML_UseDOM {
    //XML-дескрипторы, которые мы будем использовать в нашем документе
    const string XML_R00T_TAG = "AllMyData";
    const string XML_USERINFO_TAG = "Userlnfo";
    const string XML_USERID_TAG = "UserlD";
    const string XML_NAMEINF0_TAG = "Name";
    const string XML_FIRSTNAME_TAG = "FirstName";
    const string XML_LASTNAME_TAG = "LastName";
    //	
    //Загружает пользовательское состояние //
    // [in] fileName:     Имя файла, используемого для сохранения данных
    // [out] userld:       Загруженный идентификатор пользователя
    // [out] firstName: Загруженное имя пользователя
    // [out] lastName:   Загруженная фамилия пользователя
    //	
    public static void XML_LoadUserInfo(string fileName,
    out int userld, out string firstName, out string lastName)
    {
    //Начинаем с нулевых значений userld = 0; firstName = ""; lastName = ,,n;
    //Предполагаем, что данные еще не загружены bool gotUserlnfoData = 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_R00T_TAG) {
    throw new Exception("Тип корневого узла не совпадает с ожидаемым!");
    }
    //	
    //Простой конечный автомат для итеративного обхода всех узлов
    //	
    foreach(System.Xml.XmlElement childOf_RootNode in rootElement.ChildNodes)
    {
    //Если это узел Userlnfo, то мы хотим просмотреть его содержимое
    if(childOf_RootNode.Name = XML_USERINFO_TAG)
    I
    gotUserlnfoData   = true; //Пользовательские данные найдены
    //	
    //Загрузить каждый из подэлементов
    //	
    foreach(System.Xml.XmlElement child_UserDataNode in childOf_RootNode.ChildNodes)
    {
    //Идентификатор пользователя (UserlD)
    if(child_UserDataNode.Name = XML_USERID_TAG)
    {
    userld = System.Convert.ToInt32( child_UserDataNode.InnerText);
    }
    //ФИО пользователя (UserName) else if(child UserDataNode.Name == XML NAMEINFO TAG)
    foreach(System.Xml.XmlElement child_Name in childJJserDataNode.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 }
    //Конец цикла разбора Userlnfo ) Конец оператора if, осуществляющего проверку Userlnfo }
    //Конец цикла разбора корневого узла
    if (gotUserlnfoData == false) 
    {
    throw new Exception("Данные пользователя в XML-документе не найдены!");
    }
    
    //	
    //Сохраняет пользовательское состояние //
    // [in] fileName:   Имя файла, используемого для сохранения данных
    // [in] userld:       Идентификатор пользователя, который мы хотим сохранить
    // [in] firstName: Имя пользователя, которое мы хотим сохранить
    // [in] lastName:   Фамилия пользователя, которую мы хотим сохранить
    //	
    public static void XML_SaveUserInfo(string fileName, int userld, string firstName, string lastName)
    {
    System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
    //	
    //Добавить элемент документа высшего уровня
    //	
    System.Xml.XmlElement rootNodeForDocument; rootNodeForDocument = xmlDocument.CreateElement(
    XML_R00T_TAG); xmlDocumen t.Appen dCh i1d(гооtNode For Document);
    //	
    //Добавить данные в элемент Userlnfo
    //	
    System.Xml.XmlElement topNodeForUserData; topNodeForUserData = xmlDocument.CreateElement(
    XML_USERINFO_TAG); rootNodeForDocument.AppendChild(topNodeForUserData);
    //	
    //Добавить значение UserlD в наш документ
    //	
    
    //Создать подузел для информации о пространстве имен System.Xml.XmlElement subNodeForUserlD; subNodeForUserlD =
    xmlDocument.CreateElement(XML_USERID_TAG); subNodeForUserlD.InnerText =
    System.Convert.ToString(userld);
    //Присоединить подузел UserlD к узлу высшего уровня topNodeForUserData.AppendChild(subNodeForUserlD);
    //	
    //Добавить все значения Namelnfo в наш документ
    //	
    
    //Создать подузел для информации о пространстве имен System.Xml.XmlElement subNodeForNamelnfо; 
    subNodeForNamelnfo = xmlDocument.CreateElement( XML_NAMEINFO_TAG);
    //Имя (FirstName)
    System.Xml.XmlElement subNodeFirstName; subNodeFirstName = xmlDocument.CreateElement(
    XML_FIRS TNAME_TAG); subNodeFirstName.InnerText = firstName;
    //Фамилия (LastName)
    System.Xml.XmlElement subNodeLastName; subNodeLastName = xmlDocument.CreateElement(
    XML_LASTNAME_TAG); subNodeLastName.InnerText = lastName;
    //Присоединить подузлы имени и фамилии к родительскому //узлу Namelnfo
    subNodeForNamelnfo.AppendChild(subNodeFirstName); subNodeForNamelnfo.AppendChild(subNodeLastName);
    //Присоединить подузел Namelnfo (вместе с его дочерними узлами) //к узлу высшего уровня
    topNodeForUserData.AppendChild(subNodeForNamelnfo);
    //	
    //Сохранить документ
    //	
    try
    {
    xmlDocument.Save(fileName);
    )
    catch (System.Exception ex) {
    System.Windows.Forms.MessageBox.Show(
    "Ошибка при сохранении XML-документа - " + ex.Message);
    }
    } //Конец функции } //Конец класса
    private void buttonl_Click(object sender, System.EventArgs e) 
    {
    const string FILENAME = "TestFileName.XML"; 
    //Сохранить, используя XML DOM
    SaveAndLoadXML_UseDOM.XML_SaveUserInfо(FILENAME, 14, "Ivo","Salmre");
    //Сохранить, используя объект однонаправленной записи XMLWriter
    //SaveAndLoadXML_UseReaderWriter.XML_SaveUserInfо(FILENAME,
    //	18, "Ivo", "Salmre");
    int userlD; string firstName; string lastName;
    //Загрузить, используя XML DOM
    SaveAndLoadXML_UseDOM.XML_LoadUserInfo(FILENAME, out userlD,
    out firstName, out lastName);
    //Загрузить, используя объект однонаправленного чтения XMLReader
    //SaveAndLoadXML_UseReaderWriter.XML_LoadUserInfо(FILENAME,
    //	out userlD, out firstName, out lastName);
    System.Windows.Forms.MessageBox.Show("Готово! " +userlD.ToString() + ", 
    " + lastName + ", " + firstName);

    Модель однонаправленного чтения-записи XML-данных

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

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

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

    Класс XmlTextReader обеспечивает быстрое однонаправленное чтение потока XML-данных. Данные могут быть получены из файла, объекта потока Stream или объекта TextReader. XmlTextReader обычно применяется если нужно считать XML документ и получить из него данные. Так как XmlTextReader не загружает весь документ в память, он является наилучшим выбором при обработке больших XML файлов - логов, дампов БД и пр.

    Прочитаем данные с помощью класса XmlTextReader из XML-файла, ранее. В данном случае в файле будет содержаться информация о товарах предприятия и заказах.

    OpenFileDialog dlg = new OpenFileDialog();
    dlg.Filter = "Файлы XML (*.xml)|*.xml"; if (dlg.ShowDialog() ! = DialogResult.OK)
        return; 
    
    XmlTextReader reader = null;
    orders.Clear(); 
    
    try
    {
        reader = new XmlTextReader(dlg.FileName);
        reader.WhitespaceHandling = WhitespaceHandling.None; // пропускаем пустые узлы 
    
        while (reader.Read())
            if (reader.NodeType == XmlNodeType.Element)
                if (reader.Name == "Заказ")
                {
                     Order order = new Order(reader.GetAttribute("Адрес"), 
                     DateTime.Parse(reader.GetAttribute("Дата")));  
    
                     // получаем товары в заказе
                     while (reader.Read()  reader.Name == "Товар")
                         order.AddGood(reader.GetAttribute("Название"), 
                         float.Parse(reader.GetAttribute("Цена"))); 
                     orders.Add(order);
                }
    
                ShowOrders();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Ошибка: " + ex.Message);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }

    XML-данные, которые читает XmlTextReader, берутся из файла, выбранного пользователем в диалоге. Для подавления пустых строк мы устанавливаем значение None для свойства WhitespaceHandling. Метод Read() производит чтение из потока следующего узла XML-документа. Он возвращает true если удалось считать узел. Обязательно нужно вызвать метод Read перед первым обращением к данным, т.к. в момент инициализации XmlTextReader не содержит никаких данных.

    Разработчики уделяют огромное внимание поиску реализаций алгоритма, которые позволяют добиться максимального быстродействия. А вот о том, стоит ли вообще выполнять данную работу на мобильном устройстве, они чаще всего не задумываются. Во многих случаях некоторая работа может быть выполнена еще до того, как данные поступят на устройство, или переложена на сервер и выполнена в ответ на запрос. Располагая большими объемами доступной памяти, мощными процессорами и накопителями, серверы могут с успехом выполнять значительную часть необходимой предварительной работы, а также обработку по требованию, что можно использовать с выгодой для нужд мобильных приложений.

    Лучше всего обрабатывать XML-данные на сервере еще до того, как они поступят на устройство. Если приложение ориентировано на использование данных, прошедших предварительную сортировку, фильтрацию и преобразования, то выполнение этой работы на сервере, прежде чем данные попадут на устройство, может принести вам реальные дивиденды в плане производительности. Эта задача заслуживает того, чтобы вы направили на нее часть своей творческой энергии.

    Вернуться к учебному плану