C++. Сборник рецептов - [199]
> 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
> static_cast
> 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
>void serialize(Archive& ar, const unsigned int version);
В реализации >serialize
необходимо обеспечить запись каждого данного-члена класса в указанный архив в виде пары «имя-значение», используя оператор >&
. Например, если вы хотите сериализовать и десериализовать экземпляры класса >Contact
из примера 14.2, добавьте функцию-член >serialize
, как это сделано в примере 14.25.
Пример 14.25. Добавление поддержки сериализации в класс Contact из примера 14.2
>#include
>class Contact {
> ...
>private:
> friend class boost::serialization::access;
> template
> 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
>...
>class Contact {
> ...
>private:
> friend class boost::serialization::access;
> template
> 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
, подключая его к тому же самому ресурсу, который использовался первым архивом, и применяя оператор >>>
.
Пример 14.27 показывает, как можно использовать Boost.Serialization для сохранения вектора >std::vector
, состоящего из объектов >Animal
, в файле animals.xml и затем для загрузки его обратно в память. В примере 14.28 показано содержимое файла animals.xml после выполнения программы из примера 14.27.
Пример 14.27 Сериализация вектора std::vector, состоящего из объектов Animal
>#include
>#include
>#include
>#include
>#include "animal.hpp" // std::vector
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.