You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中通过XQilla向XQuery传递变量并执行查询

在C++中使用XQilla传递XML变量执行XQuery查询

要在C++中给XQilla的XQuery传递XML文档变量,核心是通过XQilla的DynamicContext绑定变量与对应的DOM节点,以下是具体实现步骤和代码示例:

1. 初始化环境与依赖

首先需要初始化Xerces-C++(XQilla依赖它处理XML),并创建XQilla实例:

#include <xqilla/xqilla-dom3.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/PlatformUtils.hpp>

using namespace xercesc;
using namespace xqilla;

int main() {
    // 初始化Xerces
    XMLPlatformUtils::Initialize();

    try {
        // 创建XQilla实例
        XQilla xqilla;

2. 加载XML文档为DOM节点

将$metadataContent和$nuiContent对应的XML内容(文件或字符串)解析成DOM文档对象:

// 示例:解析XML文件到DOMDocument
        XercesDOMParser parser;
        parser.setValidationScheme(XercesDOMParser::Val_Never);

        // 加载metadata对应的XML文档
        parser.parse("metadata.xml");
        DOMDocument* metadataDoc = parser.getDocument();

        // 加载nui对应的XML文档
        parser.parse("nui.xml");
        DOMDocument* nuiDoc = parser.getDocument();

如果是从字符串加载XML,可使用MemBufInputSource:

// 从字符串加载XML的示例
        const XMLCh metadataXml[] = L"<metadata><id>123</id></metadata>";
        MemBufInputSource metadataBuf(metadataXml, XMLString::stringLen(metadataXml), "metadata_str");
        parser.parse(metadataBuf);
        DOMDocument* metadataDoc = parser.getDocument();

3. 编译XQuery并绑定变量

编译XQuery语句,通过DynamicContext将变量与DOM节点绑定:

// 定义包含目标变量的XQuery语句
        const XMLCh xqueryStr[] = L"for $m in $metadataContent//metadata, $n in $nuiContent//nui where $m/id = $n/id return $n";

        // 编译XQuery
        AutoPtr<XQuery> query = xqilla.parse(xqueryStr);

        // 获取动态上下文用于绑定变量
        AutoPtr<DynamicContext> context = xqilla.createDynamicContext();

        // 绑定变量(注意变量名不带$前缀)
        context->setVariable(XMLString::transcode("metadataContent"), metadataDoc);
        context->setVariable(XMLString::transcode("nuiContent"), nuiDoc);

4. 执行查询并处理结果

执行编译后的查询,遍历处理结果集:

// 执行查询获取结果迭代器
        AutoPtr<Result> result = query->execute(context);

        // 遍历输出结果
        Item::Ptr item;
        while((item = result->next(context)).notNull()) {
            DOMNode* node = (DOMNode*)item->getInterface(Node::DOM_NODE);
            XMLCh* nodeName = XMLString::transcode(node->getNodeName());
            std::cout << "Result node: " << nodeName << std::endl;
            XMLString::release(&nodeName);
        }

5. 资源清理

最后释放资源并终止Xerces:

} catch (const XMLException& e) {
        XMLCh* errMsg = e.getMessage();
        std::cerr << "XML Error: " << XMLString::transcode(errMsg) << std::endl;
        XMLString::release(&errMsg);
    } catch (const XQException& e) {
        XMLCh* errMsg = e.getMessage();
        std::cerr << "XQilla Error: " << XMLString::transcode(errMsg) << std::endl;
        XMLString::release(&errMsg);
    }

    // 终止Xerces
    XMLPlatformUtils::Terminate();
    return 0;
}

关键注意事项

  • 绑定变量时,变量名无需带$前缀,直接使用metadataContent和nuiContent。
  • 确保XML文档解析成功,避免空指针;字符串加载时需使用XMLCh宽字符编码。
  • 建议用AutoPtr管理XQilla/Xerces的动态对象,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Fei Su

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:02:52