使用libxml2进行递归XPath查询的最有效方法是什么? [英] What's the most efficient way to do recursive XPath queries using libxml2?

查看:103
本文介绍了使用libxml2进行递归XPath查询的最有效方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've written a C++ wrapper function for libxml2 that makes it easy for me to do queries on an XML document:

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

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

But I have a problem: I need to be able to do another XPath query on the results of my first query.

当前,我将整个子文档存储在XPathResult对象中,然后将XPathResult.subdoc传递到XPathQuery函数中.这是非常低效的.

Currently I do this by storing the entire subdocument in my XPathResult object, and then I pass XPathResult.subdoc into the XPathQuery function. This is awfully inefficient.

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

So I'm wondering ... does libxml2 provide anything that would make it easy to store the context of an xpath query (a reference to a node, perhaps?) and then perform another query using that reference as the xpath root?

推荐答案

您应该重用xmlXPathContext并只是更改其node成员.

You should reuse the xmlXPathContext and just change its node member.

#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;
}

这篇关于使用libxml2进行递归XPath查询的最有效方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆