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

на главную - закладки

Жанры

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,

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

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Купец III ранга

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

Служанка. Второй шанс для дракона

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Служанка. Второй шанс для дракона

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

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

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

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Легионер (пять книг цикла "Рысь" в одном томе)

Посняков Андрей
Рысь
Фантастика:
фэнтези
7.38
рейтинг книги
Легионер (пять книг цикла Рысь в одном томе)