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

ЖАНРЫ

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

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

Шрифт:

}

Можно поступить по-другому и использовать парсер 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

#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");

Поделиться с друзьями: