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;
...
}
На
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");
Поделиться с друзьями: