Чтение онлайн

на главную

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

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 <exception>

#include <iostream> // cout

#include <xercesc/dom/DOM.hpp>

#include <xercesc/framework/LocalFileFormatTarget.hpp>

#include <xercesc/util/PlatformUtils.hpp>

#include <pathan/XPathNamespace.hpp>

#include <pathan/XPathResult.hpp>

<include <pathan/XPathEvaluator.hpp>

#include <pathan/XPathExpression.hpp>

#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<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,

Поделиться:
Популярные книги

Начальник милиции. Книга 4

Дамиров Рафаэль
4. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 4

Виконт, который любил меня

Куин Джулия
2. Бриджертоны
Любовные романы:
исторические любовные романы
9.13
рейтинг книги
Виконт, который любил меня

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Релокант

Ascold Flow
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант

Купец VI ранга

Вяч Павел
6. Купец
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Купец VI ранга

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

Я тебя не отпущу

Коваленко Марья Сергеевна
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не отпущу

Товарищ "Чума" 2

lanpirot
2. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 2

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9