* Определить 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 ';

   return EXIT_FAILURE;

  }

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

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

  DOMPtr<DOMBuilder> parser =

   static cast<DOMImplementationLS*>(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<XPathEvaluator>

   evaluator(XPathEvaluator::createEvaluator());

  auto_ptr<XPathNSResolver>

   resolver(evaluator->createNSResolver(animalList));

  auto_ptr<XPathExpression> xpath(

   evaluator->createExpression(FromNative(

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

   )

  );

  auto_ptr<XPathEvaluator> evaluator(XPathEvaluator::createEvaluator());

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

  auto_ptr<XPathExpression> 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<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()) << ' ';

  return EXIT_FAILURE;

 } catch (const XPathException &e) {

  cout << e.getString() << ' ';

  return EXIT_FAILURE;

 } catch (const exception& e) {

  cout << e.what() << ' ';

  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>

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату