* Определить 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. Эта библиотека позволяет сохранять и восстанавливать объекты, используя классы, называемые <<, и восстановить их, используя оператор >>.
Чтобы сделать класс сериализуемым, добавьте шаблон функции-члена serialize со следующей сигнатурой.
template<typename Archive>

 
                