gpt4 book ai didi

c++ - 使用 libxml2 执行递归 XPath 查询的最有效方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:26 25 4
gpt4 key购买 nike

我已经为 libxml2 编写了一个 C++ 包装器函数,它使我可以轻松地对 XML 文档进行查询:

bool XPathQuery(
const std::string& doc,
const std::string& query,
XPathResults& results);

但我有一个问题:我需要能够对第一个查询的结果执行另一个 XPath 查询。

目前,我通过将整个子文档存储在我的 XPathResult 对象中来实现这一点,然后将 XPathResult.subdoc 传递给 XPathQuery 函数。这是非常低效的。

所以我想知道... libxml2 是否提供了任何东西可以使存储 xpath 查询的上下文(也许是对节点的引用?)然后使用该引用作为 xpath 根执行另一个查询变得容易?

最佳答案

您应该重用 xmlXPathContext 并仅更改其 node 成员。

#include <stdio.h>
#include <libxml/xpath.h>
#include <libxml/xmlerror.h>

static xmlChar buffer[] =
"<?xml version=\"1.0\"?>\n<foo><bar><baz/></bar></foo>\n";

int
main()
{
const char *expr = "/foo";

xmlDocPtr document = xmlReadDoc(buffer,NULL,NULL,XML_PARSE_COMPACT);
xmlXPathContextPtr ctx = xmlXPathNewContext(document);
//ctx->node = xmlDocGetRootElement(document);

xmlXPathCompExprPtr p = xmlXPathCtxtCompile(ctx, (xmlChar *)expr);
xmlXPathObjectPtr res = xmlXPathCompiledEval(p, ctx);

if (XPATH_NODESET != res->type)
return 1;

fprintf(stderr, "Got object from first query:\n");
xmlXPathDebugDumpObject(stdout, res, 0);
xmlNodeSetPtr ns = res->nodesetval;
if (!ns->nodeNr)
return 1;
ctx->node = ns->nodeTab[0];
xmlXPathFreeObject(res);

expr = "bar/baz";
p = xmlXPathCtxtCompile(ctx, (xmlChar *)expr);
res = xmlXPathCompiledEval(p, ctx);

if (XPATH_NODESET != res->type)
return 1;
ns = res->nodesetval;
if (!ns->nodeNr)
return 1;
fprintf(stderr, "Got object from second query:\n");
xmlXPathDebugDumpObject(stdout, res, 0);

xmlXPathFreeContext(ctx);
return 0;
}

关于c++ - 使用 libxml2 执行递归 XPath 查询的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com