C++. Сборник рецептов - [189]

Шрифт
Интервал

>  }

> }


> void endElement(

>  const XMLCh *const uri,       // uri пространства имен

>  const XMLCh *const localname, // простое имя тега

>  const XMLCh *const qname )    // квалифицированное имя тега

> {

>  static XercesString animalList = fromNative("animal-list");

>  static XercesString animal = fromNative("animal");

>  // Обновить флаги parsingAnimalList, parsingAnimal_

>  // и parsingAnimalChild_; делегировать основную работу

>  // endAnimalChild()

>  if (localname == animal) {

>   parsingAnimal_ = false;

>  } else if (localname == animalList) {

>   parsingAnimalList_ = false;

>  } else {

>   endAnimalChild(uri, localname, qname);

>   parsingAnimalChild_ = false;

>  }

> }


> // Получает уведомления о встрече символьных данных

> void characters(const XMLCh* const chars, const unsigned int length) {

>  // Добавляет символы в конец currentText_ для обработки методом

>  // endAnimalChild()

>  currentText.append(chars, length);

> }


>private:

> // Если текущий элемент представляет ветеринара или дрессировщика,

> // используйте attrs для конструирования объекта Contact для

> // текущего Animal; в противном случае очистите currentText_,

> // подготавливая обратный вызов characters()

> void startAnimalChild(

>  const XMLCh *const uri,       // uri пространства имен

>  const XMLCh *const localname, // простое имя тега

>  const XMLCh *const qname,     // квалифицированное имя тега

>  const Attributes &attrs )     // Набор атрибутов

> {

>  static XercesString vet = fromNative("veterinarian");

>  static XercesString trainer = fromNative("trainer");

>  Animal& animal = animalList_.back();

>  if (localname == vet) {

>   // Мы встретили элемент "ветеринар".

>   animal.setVeterinarian(contactFromAttributes(attrs));

>  } else if (localname == trainer) {

>   // Мы встретили элемент "дрессировщик".

>   animal.setTrainer(contactFromAttributes(attrs));

>  } else {

>   // Мы встретили элемент "кличка , "вид" или

>   // "дата рождения". Его содержимое будет передано функцией

>   // обратного вызова characters().

>   currentText_.clear();

>  }

> }


> // Если текущий элемент представляет кличку, вид или дату рождения,

> // используйте текст, находящийся в currentText_, для установки

> // соответствующего свойства текущего объекта

> Animal. void endAnimalChild(

>  const XMLCh *const uri,       // uri пространства имен

>  const XMLCh *const localname, // простое имя тега

>  const XMLCh *const qname)     // квалифицированное имя тега

> {

>  static XercesString name = fromNative("name");

>  static XercesString species = fromNative("species");

>  static XercesString dob = fromNative("dateOfBirth");

>  // currentText_ содержит текст элемента, который только что

>  // закончился. Используйте его для установки свойств текущего

>  // объекта Animal.

>  Animal& animal = animalList_.back();

>  if (localname == name) {

>   animal.setName(toNative(currentText_));

>  } else if (localname == species) {

>   animal.setSpecies(toNative(currentText_));

>  } else if (localname == dob) {

>   animal.setDateOfBirth(toNative(currentText_));

>  }

> }


> vector& animalList_; // заполняемый список

> bool parsingAnimalList_;     // состояние анализа

> bool parsingAnimal_;         // состояние анализа

> bool parsingAnimalChild_;    // состояние анализа

> XercesString currentText_;   // символьные данные текущего

>                              // текстового узла

>};

Из сравнения примера 14.9 с примером 14.6 видно, насколько сложным может быть проверка структуры документа с помощью функций обратного вызова. Более того, в примере 14.6 не делается столько проверок, как в примере 14.3: здесь, например, не проверяется порядок следования дочерних элементов элемента животного. К счастью, существует гораздо более простой способ проверки структуры документа с использованием SАХ2, как вы это увидите в рецептах 14.5 и 14.6.

Смотри также

Рецепты 14.1, 14.4, 14.5 и 14.6.

14.4. Манипулирование документом XML

Проблема

Требуется представить документ XML в виде объекта С++, чтобы можно было манипулировать его элементами, атрибутами, текстом, DTD, инструкциями обработки и комментариями

Решение

Используйте реализованную в Xerces модель W3C DOM. Во-первых, используйте класс >xercesc::DOMImplementationRegistry для получения экземпляра >xercesc::DOMImplementation, затем используйте >DOMImplementation для создания экземпляра парсера >xercesc::DOMBuilder. На следующем шаге зарегистрируйте экземпляр >xercesc::DOMErrorHandler для получения уведомлений об ошибках, обнаруженных в ходе анализа, и вызовите метод парсера >parseURI(), передавая в качестве аргумента URI документа XML или полное имя файла. Если анализ документа завершается успешно, метод >parseURI возвратит указатель на объект >DOMDocument, представляющий документ XML. Затем вы можете использовать функции, определенные в спецификации W3C DOM для просмотра и манипулирования документом.

Обработав документ, вы можете сохранить его в файле, получая >DOMWriter из >DOMImplementation и вызывая его метод >writeNode() с передачей указателя на >DOMDocument в качестве аргумента.

Пример 14.10 показывает, как можно использовать DOM для синтаксического анализа документа animals.xml, приведенного в примере 14.1, затем найти и удалить узел, относящийся к слону Herby, и сохранить модифицированный документ.


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.