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

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

поддерживает иерархический синтаксис ссылок на элементы, атрибуты и текстовые узлы на основе использования их имен, атрибутов, текстового содержимого, отношений наследования и других свойств. Кроме работы с наборами узлов язык XPath может обрабатывать строки, числа и булевы значения. XPath версии 2.0, которая в настоящее время не поддерживается библиотекой Xalan, использует даже более сложную модель данных, основанную на рекомендациях XML Schema. (См. рецепт 14.5.)

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(),


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.