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

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

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

Например, пусть требуется выполнить синтаксический анализ документа XML animals.xml, приведенного в примере 14.1, и сконструировать вектор

std::vector
объектов
Animal
, представляющих животных, перечисленных в этом документе. (Определение класса
Animal
дается в примере 14.2.) В примере 14.3 я показываю, как можно это сделать, используя TinyXml. Для усложнения задачи добавим в документ пространства имен, как показано в примере 14.5.

Пример 14.5. Список

цирковых животных, в котором используются пространства имен XML

<?xml version="1.0" encoding="UTF-8"?>

<!- Животные цирка Feldman Family Circus с использованием пространств имен -->

<ffc:animalList xmlns:ffc="http://www.feldman-family-circus.com">

 <ffc:animal>

<ffc:name>Herby</ffc:name>

<ffc:species>elephant</ffc:species>

<ffc:dateOfBirth>1992-04-23</ffc:dateOfBirth>

<ffc:veterinarian name="Dr. Hal Brown" phone="(801)595-9627"/>

<ffc:trainer name="Bob Fisk" phone="(801)881-2260"/>

 </ffc:animal>

 <!- и т.д.
– ->

</ffc:animalList>

Для анализа этого документа с помощью SAX2 определите

ContentHandler
, как показано в примере 14.6, и
ErrorHandler
, как показано в примере 14.7. Затем сконструируйте
SAX2XMLReader
, зарегистрируйте ваши обработчики и запустите парсер. Это проиллюстрировано в примере 14.8.

Пример 14.6. Применение SAX2 ContentHandler для синтаксического анализа документа animals.xml

#include <stdexcept> // runtime_error

#include <vector>

#include <xercesc/sax2/Attributes.hpp>

#include <xercesc/sax2/DefaultHandler.hpp> // Содержит реализации без

// операций для различных

// обработчиков, используемых

#include "xerces_strings.hpp" // в примере 14.4

#include "animal.hpp"

using namespace std;

using namespace xercesc;

// Возвращает экземпляр Contact, построенный

// на основе заданного набора атрибутов

Contact contactFromAttributes(const Attributes &attrs) {

 // Для повышения эффективности хранить часто используемые строки

 // в статических переменных

 static XercesString name = fromNative("name");

 static XercesString phone = fromNative("phone");

 Contact result; //
Возвращаемый объект Contact.

 const XMLCh* val; // Значение атрибута name или phone.

 // Установить имя объекта Contact.

 if ((val = attrs.getValue(name.c_str)) != 0) {

result.setName(toNative(val));

 } else {

throw runtime_error("contact missing name attribute");

 }

 // Установить номер телефона для объекта Contact.

 if ((val = attrs.getValue(phone.c_str)) != 0) {

result.setPhone(toNative(val));

 } else {

throw runtime_error("contact missing phone attribute");

 }

 return result;

}

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

// уведомления о начале и конце элементов

class CircusContentHandler : public DefaultHandler {

public:

 CircusContentHandler(vector<Animal>& animalList) :

animalList_(animalList) {}

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

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

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

 // обратный вызов characters

 void startElement(

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

const XMLCh *const localname, // имя тега без префикса NS

const XMLCh *const qname, // имя тега + префикс NS

const Attributes &attrs) // атрибуты элементов

 {

static XercesString animalList = fromNative("animalList");

static XercesString animal = fromNative("animal");

static XercesString vet = fromNative("veterinarian");

static XercesString trainer = fromNative("trainer");

static XercesString xmlns =

fromNative("http://www.feldman-family-circus.com");

// проверить URI пространства имен

if (uri != xmlns)

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

Возвышение Меркурия. Книга 17

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

Повелитель механического легиона. Том III

Лисицин Евгений
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том III

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Мастер 9

Чащин Валерий
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 9

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Контракт на материнство

Вильде Арина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Контракт на материнство

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2