Example #1
0
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;
}