Чтение онлайн

на главную - закладки

Жанры

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

Салмре Иво

Шрифт:
Соображения, побуждающие избегать использования однонаправленной обработки XML-данных 

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

поддерживает хранящееся в памяти дерево документа, она позволяет легко совершать обход этого дерева для поиска нужных узлов и внесения необходимых изменений. 

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

■ Модели однонаправленной обработки требуют использования более сложных программных моделей, реализующих навигацию и операции поиска в сложных документах. Написание кода универсального синтаксического анализатора, который работал бы с произвольными иерархиями XML, может вызывать большие трудности. Чтобы найти искомую информацию, вам придется использовать очень сложное состояние, позволяющее определять, в каком узле дерева документа вы находитесь. Так, если вы осуществляете поиск дескриптора <Name>, находящегося внутри определенного дескриптора <Customer>, и в вашем XML-документе имеются дескрипторы <Name>, соответствующие объектам <Customer>, <Employee> и <Vendor>, которые могут присутствовать в XML-дереве на иерархических уровнях различной глубины, то для того, чтобы иметь возможность различать эти случаи и тем caмым гарантировать, что вы получаете корректную информацию, вам придется написать код, отслеживающий, в каком месте документа в настоящее время осуществляется просмотр. Если документ следует единственной корректно- определенной схеме, то, возможно, это не так уж плохо. С другой стороны, если документ может быть подготовлен с использованием одной из нескольких возможных схем, то задача становится алгоритмически сложной. В случае особо сложных документов следует рассмотреть вариант выполнения обработки на сервере, ибо там предоставляются не только более мощные вычислительные возможности, но и более мощные API-интерфейсы, предназначенные для проведения поиска в XML-документах (например, XPATH, поддерживающий запросы данных документа).

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

Листинг 10.3. Использование однонаправленного чтения-записи XML-данных для загрузки XML-документа из файла и его сохранения

using System;

public class SaveAndLoadXML UseReaderWriter {

 //XML-дескрипторы,
которые мы будем использовать в своем документе

 const string XML_ROOT_TAG = "AllMyData";

 const string XML_USERINFO_TAG = "UserInfo";

 const string XMI_USERID_TAG = "UserID";

 const string XML_NAMEINFO_TAG = "Name";

 const string XML_FIRSTNAME_TAG = "FirstName";

 const string XML_LASTNAME TAG = "LastName";

 //Набор состояний, отслеживаемых по мере чтения данных

 private enum ReadLocation {

inAllMyData,

inUserInfo,

inUserID,

inName,

inFirstName,

inLastName,

 }

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

 //Сохраняет пользовательское состояние

 //

 // [in] fileName: Имя файла, используемого для сохранения данных

 // [in] userId: Идентификатор пользователя, который мы хотим сохранить

 // [in] firstName: Имя пользователя, которое мы хотим сохранить

 // [in] lastName: Фамилия пользователя, которую мы хотим сохранить

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

 public static void XML_SaveUserInfo(string fileName, int userId,string firstName, string lastName) {

System.Xml.XmlTextWriter xmlTextWriter;

xmlTextWriter =new System.Xml.XmlTextWriter(fileName, System.Text.Encoding.Default);

//Записать содержимое документа!

//<Root>

xmlTextWriter.WriteStartElement(XML_ROOT_TAG);

//<Root>

xmlTextWriter.WriteStartElement(XML_USERINFO_TAG);

//<Root><UserID>

//<Root><UserInfo>

xmlTextWriter.WriteStartElement(XML_NAMEINFO_TAG);

//<Root><UserInfo><Name>

xmlTextWriter.WriteStartElement(XML_FIRSTNAME_TAG);

//<Root><UserInfo><Name><FirstName>

xmlTextWriter.WriteString(firstName); //Запись значения

xmlTextWriter.WriteEndElement; //Закрыть дескриптор имени

//<Root><UserInfo><Name>

xmlTextWriter.WriteStartElement(XML_LASTNAME_TAG);

//<Root><UserInfo><Name><LastName>

xmlTextWriter.WriteString(lastName); //Запись значения

xmlTextWriter.WriteEndElement; //Закрыть дескриптор фамилии

Поделиться:
Популярные книги

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Призыватель нулевого ранга

Дубов Дмитрий
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга