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

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

Жанры

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

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

Шрифт:

resolver.get

));

// Вычислить выражение.

XPathResult* result = xpath->evaluate(doc,

XPathResult::ORDERED_NODE_ITERATOR_TYPE, 0

);

DOMNode* herby;

if (herby = result->iterateNext) {

animalList->removeChild(herby);

herby->release; // optional

}

// Сконструировать DOMWriter
для сохранения animals.xml

DOMPtr<DOMWriter> writer =

static_cast<DOMImplementationLS->(impl)->createDOMWriter;

writer->setErrorHandler(&err);

// Сохранить animals.xml.

LocalFileFormatTarget file("circus.xml");

writer->writeNode(&file, *animalList);

 } catch (const DOMException& e) {

cout << toNative(e.getMessage) << "\n";

return EXIT_FAILURE;

 } catch (const XPathException &e) {

cout << e.getString << "\n";

return EXIT_FAILURE;

 } catch (const exception& e) {

cout << e.what << "\n";

return EXIT_FAILURE;

 }

}

Пример 14.24 использует Pathan 1, который реализует рекомендации XPath 1.0; библиотекой Xalan в настоящее время поддерживается именно эта версия. Pathan 2, который в настоящее время доступен в бета-версии, обеспечивает предварительную реализацию рекомендаций XPath 2.0. Pathan 2 представляет собой более точную реализацию стандарта XPath; я рекомендую использовать Pathan 2 вместо Pathan 1, как только станет доступна не бета-версия.

Смотри также

Рецепт 14.7.

14.9. Применение XML для сохранения и восстановления набора объектов

Проблема

Требуется иметь возможность сохранения набора объектов C++ в документе XML и считывания их потом обратно в память.

Решение

Используйте библиотеку Boost Serialization. Эта библиотека позволяет сохранять и восстанавливать объекты, используя классы, называемые архивами. Для использования этой библиотеки вы должны сначала сделать каждый из ваших классов сериализуемым (serializable), что просто означает возможность записи экземпляров класса в архив (это называется сериализацией) и их обратного считывания в память (это называется десериализацией). Затем на этапе выполнения вы можете сохранить ваши объекты в архиве XML, используя оператор

<<
, и восстановить их, используя оператор
>>
.

Чтобы сделать класс сериализуемым, добавьте шаблон функции-члена

serialize
со следующей сигнатурой.

template<typename Archive>

void serialize(Archive& ar, const unsigned int version);

В реализации

serialize
необходимо обеспечить запись каждого данного-члена класса в указанный архив в виде пары «имя-значение», используя оператор
&
. Например, если вы хотите сериализовать
и десериализовать экземпляры класса
Contact
из примера 14.2, добавьте функцию-член
serialize
, как это сделано в примере 14.25.

Пример 14.25. Добавление поддержки сериализации в класс Contact из примера 14.2

#include <boost/serialization/nvp.hpp> // пара "имя-значение"

class Contact {

 ...

private:

 friend class boost::serialization::access;

 template<typename Archive>

 void serialize(Archive& ar, const unsigned int version) {

// Записать (или считать) каждое данное-член в виде пары имя-значение

using boost::serialization::make_nvp;

ar & make_nvp("name", name_);

ar & make_nvp("phone", phone_);

 }

...

};

Аналогично можно обеспечить сериализацию класса

Animal
из примера 14.2, как это сделано в примере 14.26.

Пример 14.26. Добавление поддержки сериализации для класса Animal из примера 14.2

...

// Включить поддержку сериализации для boost::gregorian::date

#include <boost/date_time/gregorian/greg_serialize.hpp>

...

class Contact {

 ...

private:

 friend class boost::serialization::access;

 template<typename Archive>

 void serialize(Archive& ar, const unsigned int version) {

// Записать (или считать) каждое данное-член в виде пары имя-значение

using boost::serialization::make_nvp;

ar & make_nvp("name", name_);

ar & make_nvp("species", species_);

ar & make_nvp("dateOfBirth", dob_);

ar & make_nvp("veterinarian", vet_);

ar & make_nvp("trainer", trainer_);

 }

 ...

};

Теперь вы можете сериализовать Animal, создавая архив XML типа

boost::archive::xml_oarchive
и записывая информацию о животном в архив, используя оператор
<<
. Конструктор
xml_oarchive
в качестве аргумента принимает
std::ostream
; часто этим аргументом будет поток вывода, используемый для записи в файл, однако в общем случае для записи данных может использоваться ресурс любого типа. После сериализации экземпляра
Animal
его можно считать обратно в память, конструируя архив XML типа boost::archive::
xml_iarchive
, подключая его к тому же самому ресурсу, который использовался первым архивом, и применяя оператор
>>
.

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

Царь Федор. Трилогия

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

Маверик

Астахов Евгений Евгеньевич
4. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Маверик

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Ванька-ротный

Шумилин Александр Ильич
Фантастика:
альтернативная история
5.67
рейтинг книги
Ванька-ротный

Завод: назад в СССР

Гуров Валерий Александрович
1. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод: назад в СССР

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

Барон меняет правила

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

Последний Паладин

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

Мастер 8

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

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

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