如何在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
相关产品推荐
相关产品推荐

