Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

XPath-выражения вычисляются в контексте узла документа XML, называемого контекстным узлом, который используется для интерпретации связанной с ним конструкции, например, parent, childи descendant. В примере 14.23 я указал корень ( root) документа XML в качестве контекстного узла; этот узел является родительским по отношению к корневому элементу документа XML, а также к любой инструкции обработки и комментариям верхнего уровня. При вычислении выражения с использованием корневого узла в качестве контекстного узла выражение пути animalList/animal/name/child::text()соответствует всем текстовым узлам, дочерним по отношению к элементам name, родительским элементом которых является animal, и чьим «дедушкой» является элемент animalList.

Метод evaluate()класса XPathEvaluatorвозвращает XObjectPtr, представляющий результат вычисления выражения XPath. Тип данных, на который ссылается XObjectPtr, можно узнать путем его разыменования с получением XObjectи вызова метода getType(); затем можно получить доступ к базовым данным при помощи вызова num(), boolean(), str()или nodeset(). Поскольку XPath-выражение в примере 14.23 представляет набор узлов, я использовал метод nodeset()для получения ссылки на NodeRefListBase, который обеспечивает доступ к узлам в наборе с помощью его методов getLength()и item(). Метод item()возвращает указатель на узел XalanNode, метод getNodeValue()которого возвращает строку с интерфейсом, похожим на интерфейс std::basic_string.

Поскольку XPath обеспечивает простой способ определения местоположения узлов в документе XML, возникает естественный вопрос о возможности применения выражений Xalan XPath для получения экземпляров xercesc::DOMNodeиз xercesc::DOMDocument. На самом деле это возможно, но не совсем удобно, а кроме того, по умолчанию узлы xercesc::DOMNodes, полученные таким способом, представляют дерево документа XML с возможностями только чтения , что уменьшает пользу от применения XPath в качестве средства манипулирования DOM. Существуют способы, позволяющие обойти это ограничение, однако они достаточно сложны и потенциально опасны.

К счастью, библиотека Pathan реализует XPath, совместимый с Xerces и позволяющий легко манипулировать Xerces DOM. Пример 14.24 показывает, как можно использовать Pathan для определения места расположения и удаления узла слона Herby из документа XML, приведенного в примере 14.1, с помощью вычисления XPath-выражения animalList/animal[child::name='Herby']. Сравнение этого примера с примером 14.10 ясно показывает, насколько мощным является язык XPath.

Пример 14.24. Определение местоположения узла и удаление его с использованием библиотеки Pathan

#include

#include // cout

#include

#include

#include

#include

#include

#include

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

using namespace std;

using namespace xercesc;

/*

* Определить XercesInitializer, как это сделано в примере 14.8, а также

* CircusFrrorHandler и DOMPtr, как это сделано в примере 14.10

*/

int main() {

try {

// Инициализировать Xerces и получить DOMImplementation.

XercesInitializer init;

DOMImplementation* impl =

DOMImplementationRegistry::getDOMImplementation(

fromNative("LS").c_str()

);

if (impl == 0) {

cout << "couldn't create DOM implementation\n";

return EXIT_FAILURE;

}

// Сконструировать DOMBuilder для синтаксического анализа

// документа animals.xml.

DOMPtr parser =

static cast(impl)-> createDOMBuilder(

DOMImplementationLS::MODE_SYNCHRONOUS, 0

);

CircusErrorHandler err;

parser->setErrorHandler(&err);

// Выполнить синтаксический анализ

animals.xml. DOMDocument* doc =

parser->parseURI("animals.xml");

DOMElement* animalList = doc->getDocumentElement();

// Создать XPath-выражение.

auto_ptr

evaluator(XPathEvaluator::createEvaluator());

auto_ptr

resolver(evaluator->createNSResolver(animalList));

auto_ptr xpath(

evaluator->createExpression(FromNative(

"animalList/animal[child::name='Herby']" ).c_str(), resolver.get()

)

);

auto_ptr evaluator(XPathEvaluator::createEvaluator());

auto_ptr resolver(evaluator->createNSResolver(animalList));

auto_ptr xpath(evaluator->createExpression(

fromNative("animalList/animal[child::name='Herby']").c_str(),

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 writer =

static_cast(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

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

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x