C++. Сборник рецептов - [197]

Шрифт
Интервал

> LocalFileInputSource src(место-расположения-документа);

> XalanDocument* doc = liaison.ParseXMLStream(doc);

> ...

>}

Можно поступить по-другому и использовать парсер Xerces DOM для получения указателя на >DOMDocument, как это сделано в примере 14.14, и затем использовать экземпляры >XercesDOMSupport, >XercesParserLiaison и >XercesDOMWrapperParsedSource, каждый из которых определяется в пространстве имен >xalanc для получения указателя на >XalanDocument, соответствующего документу >DOMDocument.

>#include

>#include

>#include

>#include

>...


>int main() {

> ...

> DOMDocument* doc = ...;

> XercesDOMSupport support;

> XercesParserLiaison liaison(support);

> XercesDOMWrapperParsedSource src(doc, liaison, support);

> XalanDocument* xalanDoc = src.getDocument();

> ...

>}

На следующем шаге получите указатель на узел, выполняющий роль узла контекста при вычислении выражения XPath. Это можно сделать с помощью интерфейса DOM документа >XalanDocument. Сконструируйте >XPathEvaluator для вычисления выражения XPath и >XalanDocumentPrefixResolver для разрешения префиксов пространств имен в документе XML. Наконец, вызовите метод >XPathEvaluator::evaluate(), передавая в качестве аргументов >DOMSupport, контекстный узел, XPath-выражение и >PrefixResolver. Результат вычисления выражения возвращается в виде объекта типа >XObjectPtr; тип допустимых операций над этим объектом зависит от типа его данных XPath, который можно узнать при помощи метода >getType().

Например, пусть требуется извлечь список имен животных из документа animals.xml, представленного в примере 14.1. Вы можете это сделать, выполняя синтаксический анализ документа и вычисляя XPath-выражение >animalList/animal/name/child::text() с использованием корня документа в качестве контекстного узла. Это проиллюстрировано в примере 14.23.

Пример 14.23. Вычисление ХРаth-выражения, используя Xalan

>#include // size_t

>#include

>#include // cout

>#include

>#include

>#include

>#include

>#include

>#include

>#include

>#include

>#include

>#include

>#include "animal.hpp"

>#include "xerces_strings.hpp"


>using namespace std;

>using namespace xercesc;

>using namespace xalanc;


>// Утилита RAII, которая инициализирует парсер и процессор XPath, освобождая

>// ресурсы при выходе из области видимости

>class XPathInitializer {

>public:

> XPathInitializer() {

> XMLPlatformUtils::Initialize();

> XPathEvaluator::initialize();

>}

>~XPathInitializer() {

> XpathEvaluator::terminate();

> XMLPlatformUtils::Terminate();

>}

>private:

> // Запретить копирование и присваивание

> XPathInitializer(const XPathInitializer&);

> XPathInitializer& operator=(const XPathInitializer&);

>};


>// Получает уведомления об ошибках

>class CircusErrorHandler : public DefaultHandler {

>public:

> void error(const SAXParseException& e) {

>  throw runtime_error(toNative(e.getMessage()));

> }

> void fatalError(const SAXParseException& e) { error(e); }

>};


>int main() {

> try {

>  // Инициализировать Xerces и XPath и сконструировать парсер DOM.

>  XPathInitializer init;

>  XercesDOMParser parser;

>  // Зарегистрировать обработчик ошибок

>  CircusErrorHandler error;

>  parser.setErrorHandler(&error);

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

>  parser.parse(fromNative("animals.xml").c_str());

>  DOMDocument* doc = parser.getDocument();

>  DOMElement* animalList = doc->getDocumentElement();

>  // Создать XalanDocument на основе doc.

>  XercesDOMSupport support;

>  XercesParserLiaison liaison(support);

>  XercesDOMWrapperParsedSource src(doc, liaison, support);

>  XalanDocument* xalanDoc = src.getDocument();

>  // Вычислить XPath-выражение для получения списка

>  // текстовых узлов, содержащих имена животных

>  XPathEvaluator evaluator;

>  XalanDocumentPrefixResolver resolver(xalanDoc);

>  XercesString xpath =

>   fromNative("animalList/animal/name/child::text()");

>  XObjectPtr result =

>   evaluator.evaluate(

>    support,       // поддержка DOM

>    xalanDoc,      // контекстный узел

>    xpath.c_str(), // XPath-выражение

>    resolver);     // функция разрешения пространства имен

>  const NodeRefListBase& nodeset = result->nodeset();

>  // Просмотр списка узлов и вывод имен животных

>  for (size_t i = 0, len = nodeset.getLength(); i < len; ++i) {

>   const XMLCh* name = nodeset.item(i)->getNodeValue().c_str();

>   std::cout << toNative(name) << "\n";

>  }

> } catch (const DOMException& e) {

>  cout << "xml error: " << toNative(e.getMessage()) << "\n";

>  return EXIT_FAILURE;

> } catch (const exception& e) {

>  cout << e.what() << "\n";

>  return EXIT_FAILURE;

> }

>}

Обсуждение

XPath — это язык поиска по образцу (pattern matching language), предназначенный для извлечения информации из документов XML. Основная конструкция XPath —


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.