C++. Сборник рецептов - [198]
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
>#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
> static cast
> 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
> evaluator->createExpression(FromNative(
> "animalList/animal[child::name='Herby']" ).c_str(), resolver.get()
> )
> );
> auto_ptr
> auto_ptr
> auto_ptr
> fromNative("animalList/animal[child::name='Herby']").c_str(),
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.