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

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

Жанры

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

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

Шрифт:

#include <exception>

#include <iostream> // cout

#include <xercesc/dom/DOM.hpp>

#include <xercesc/parsers/XercesDOMParser.hpp>

#include <xercesc/sax2/DefaultHandler.hpp>

#include <xercesc/util/PlatformUtils.hpp>

#include <xalanc/DOMSupport/XalanDocumentPrefixResolver.hpp>

#include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp>

#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>

#include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp>

#include <xalanc/XPath/XObject.hpp>

#include <xalanc/XPath/XPathEvaluator.hpp>

#include "animal.hpp"

#include "xerces_strings.hpp"

using namespace std;

using namespace xercesc;

using namespace xalanc;

//
Утилита RAII, которая инициализирует парсер и процессор XPath, освобождая

// ресурсы при выходе из области видимости

class XPathInitializer {

public:

 XPathInitializer {

 XMLPlatformUtils::Initialize;

 XPathEvaluator::initialize;

}

~XPathInitializer {

 XpathEvaluator::terminate;

 XMLPlatformUtils::Terminate;

}

private:

 // Запретить копирование и присваивание

 XPathInitializer(const XPathInitializer&);

 XPathInitializer& operator=(const XPathInitializer&);

};

// Получает уведомления об ошибках

class CircusErrorHandler : public DefaultHandler {

public:

 void error(const SAXParseException& e) {

throw runtime_error(toNative(e.getMessage));

 }

 void fatalError(const SAXParseException& e) { error(e); }

};

int main {

 try {

// Инициализировать Xerces и XPath и сконструировать парсер DOM.

XPathInitializer init;

XercesDOMParser parser;

// Зарегистрировать обработчик ошибок

CircusErrorHandler error;

parser.setErrorHandler(&error);

//
Выполнить синтаксический анализ animals.xml.

parser.parse(fromNative("animals.xml").c_str);

DOMDocument* doc = parser.getDocument;

DOMElement* animalList = doc->getDocumentElement;

// Создать XalanDocument на основе doc.

XercesDOMSupport support;

XercesParserLiaison liaison(support);

XercesDOMWrapperParsedSource src(doc, liaison, support);

XalanDocument* xalanDoc = src.getDocument;

// Вычислить XPath-выражение для получения списка

// текстовых узлов, содержащих имена животных

XPathEvaluator evaluator;

XalanDocumentPrefixResolver resolver(xalanDoc);

XercesString xpath =

fromNative("animalList/animal/name/child::text");

XObjectPtr result =

evaluator.evaluate(

support, // поддержка DOM

xalanDoc, // контекстный узел

xpath.c_str, // XPath-выражение

resolver); // функция разрешения пространства имен

const NodeRefListBase& nodeset = result->nodeset;

// Просмотр списка узлов и вывод имен животных

for (size_t i = 0, len = nodeset.getLength; i < len; ++i) {

const XMLCh* name = nodeset.item(i)->getNodeValue.c_str;

std::cout << toNative(name) << "\n";

}

 } catch (const DOMException& e) {

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

return EXIT_FAILURE;

 } catch (const exception& e) {

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

return EXIT_FAILURE;

 }

}

Обсуждение

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

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

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Повелитель механического легиона. Том III

Лисицин Евгений
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том III

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Мастер 9

Чащин Валерий
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 9

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Контракт на материнство

Вильде Арина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Контракт на материнство

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2