XQillaExpressionImpl::XQillaExpressionImpl(const XMLCh *expression, MemoryManager* memMgr, const DOMXPathNSResolver *nsr, XMLGrammarPool *xmlGP) : _createdWith(memMgr), _xmlgr(xmlGP) { try { _staticContext = XQilla::createContext(XQilla::XPATH2, this, _createdWith); if(nsr != 0) { _staticContext->setNSResolver(nsr); const XMLCh *defaultElementNS = _staticContext->getMemoryManager()-> getPooledString(nsr->lookupNamespaceURI(XMLUni::fgZeroLenString)); _staticContext->setDefaultElementAndTypeNS(defaultElementNS); } _compiledExpression = XQilla::parse(expression, _staticContext, NULL, XQilla::NO_ADOPT_CONTEXT, _createdWith); } catch(XQException &e) { if(XQillaException::getDebug()) { e.printDebug(X("Caught exception at Interface")); } throw XQillaException(e); } }
QStringList ExternalPlaylist::executeXmlQuery(const QString& filePath, const QString& xPath, const QStringList& parameters){ QStringList results; // initialise Xerces-C and XQilla using XQillaPlatformUtils try{ XQillaPlatformUtils::initialize(); }catch (const xercesc_3_1::XMLException& eXerces){ qDebug("Xerces exception message: %s", UTF8(eXerces.getMessage())); return results; } // get the XQilla DOMImplementation object xercesc_3_1::DOMImplementation *xqillaImplementation = xercesc_3_1::DOMImplementationRegistry::getDOMImplementation(X("XPath2 3.0")); try{ // create a DOMLSParser object AutoDelete<xercesc_3_1::DOMLSParser> parser(xqillaImplementation->createLSParser(xercesc_3_1::DOMImplementationLS::MODE_SYNCHRONOUS, 0)); // disable remote DTD resolution parser->getDomConfig()->setParameter(xercesc_3_1::XMLUni::fgXercesLoadExternalDTD, false); // parse the XML document xercesc_3_1::DOMDocument *document = parser->parseURI(X(filePath.toLocal8Bit().constData())); if(document == 0) throw XQillaException(99,X("No XML document found")); // determine whether to use lightweight query model if(parameters.isEmpty()){ // parse XPath AutoRelease<xercesc_3_1::DOMXPathExpression> expression(document->createExpression(X(xPath.toLocal8Bit().constData()), 0)); // execute query AutoRelease<xercesc_3_1::DOMXPathResult> result(expression->evaluate(document, xercesc_3_1::DOMXPathResult::ITERATOR_RESULT_TYPE, 0)); // iterate over results while(result->iterateNext()) results.push_back(QString::fromUtf8(UTF8(result->getNodeValue()->getTextContent()))); }else{ // set up a simple API query and context to evaluate the parsed document XQilla xqilla; AutoDelete<XQQuery> xQuery(xqilla.parse(X(xPath.toLocal8Bit().constData()))); AutoDelete<DynamicContext> xQueryContext(xQuery->createDynamicContext()); // grab document from xerces API XercesConfiguration xc; Node::Ptr node = xc.createNode(document, xQueryContext.get()); // prepare context if(node && node->isNode()){ xQueryContext->setContextItem(node); xQueryContext->setContextPosition(1); xQueryContext->setContextSize(1); // bind variables for(int i=0; i<(signed)parameters.size(); i += 2){ if(i + 1 >= (signed)parameters.size()) break; Item::Ptr value = xQueryContext->getItemFactory()->createString(X(parameters[i+1].toLocal8Bit().constData()), xQueryContext.get()); xQueryContext->setExternalVariable(X(parameters[i].toLocal8Bit().constData()), value); } } // execute query Result xQueryResults = xQuery->execute(xQueryContext); // iterate over results Item::Ptr item; while(item = xQueryResults->next(xQueryContext)) { results.push_back(QString::fromUtf8(UTF8(item->asString(xQueryContext)))); } } }catch(XQillaException &e){ // DOM3 (xerces) API qDebug("XQillaException: %s", UTF8(e.getString())); }catch(XQException &e){ // Simple API qDebug("XQillaException: %s", UTF8(e.getError())); }catch(...){ qDebug("Unspecified exception with XQilla"); } // Terminate Xerces-C and XQilla using XQillaPlatformUtils XQillaPlatformUtils::terminate(); return results; }