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

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

Жанры

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

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

Шрифт:

 */

int main {

 try {

XalanInitializer init; // Инициализировать Xalan

XalanTransformer xslt; // Конвертор XSLT.

XSLTResultTarget html("animals.html"); // Результат работы xslt.

// Выполнить синтаксический анализ исходного документа

XSLTInputSource xml("animals.xml");

XalanParsedSource* parsedXml = 0;

if (xslt.parseSource(xml, parsedXml) != 0) {

cout << "xml error: " << xslt.getLastError << "\n";

}

//
Компилировать таблицу стилей.

XSLTInputSource xsl("animals.xsl");

XalanCompiledStylesheet* compiledXsl = 0;

if (xslt.compileStylesheet(xsl, compiledXsl) != 0) {

cout << "xml error: " << xslt.getLastError << "\n";

}

// Выполнить преобразование.

if (xslt.transform(xml, xsl, html)) {

cout << "xml error: " << xslt.getLastFrror << "\n";

}

 } catch (const XMLException& e) {

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

return EXIT_FAILURE;

 } catch (const exception& e) {

cout << e.what << "\n";

return EXIT_FAILURE;

 }

}

Смотри также

Рецепт 14.8.

14.8. Вычисление XPath-выражения

Проблема

Требуется извлечь информацию из документа XML, обработанного парсером, путем вычисления XPath-выражения.

Решение

Используйте библиотеку Xalan. Во-первых, выполните синтаксический анализ документа XML и получите указатель на

xalanc::XalanDocument
. Это можно сделать, используя экземпляры
XalanSourceTreeInit
,
XalanSourceTreeDOMSupport
и
XalanSourceTreeParserLiaison
, каждый из которых следующим образом определяется в пространстве имен
xalanc
.

#include <xercesc/framework/LocalFileInputSource.hpp>

#include <xalanc/XalanSourceTree/XalarSourceTreeDOMSupport.hpp>

#include <xalanc/XalanSourceTree/XalanSourceTreeInit.hpp>

#include <xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp>

...

int main {

 ...

 // Инициализировать подсистему XalanSourceTree

 XalarSourceTreeInit init;

 XalanSourceTreeDOMSupport support;

 // Интерфейс доступа к парсеру

 XalanSourceTreeParserLiaison liaison(support);

 //
Подключить DOMSupport к ParserLiaison

 support.setParserLiaison(&liaison);

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

 XalanDocument* doc = liaison.ParseXMLStream(doc);

 ...

}

Можно поступить по-другому и использовать парсер Xerces DOM для получения указателя на

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

#include <xercesc/dom/DOM.hpp>

#include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp>

#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>

#include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp>

...

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 <cstddef> // size_t

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

Начальник милиции. Книга 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