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
рейтинг книги
Повелитель механического легиона. Том III
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Матабар IV
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Вторая жена мужа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мастер 9
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Генерал-адмирал. Тетралогия
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Барон диктует правила
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Солдат Империи
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Идеальный мир для Лекаря 20
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Убивать, чтобы жить
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Контракт на материнство
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Элита элит
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Усадьба леди Анны
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00