【问题标题】:libxml2 get offset into XML text of nodelibxml2 获取节点的 XML 文本的偏移量
【发布时间】:2019-04-25 18:40:59
【问题描述】:

我需要知道在使用 xmlReadMemory 获取 dom 之后,可以在 dom 中的某个特定任意节点找到 xml 字符串的哪个偏移量。问题是我不知道从哪里获取 xmlParserCtxtPtr 作为第一个参数传递给 xmlParserFindNodeInfo 因为我的整个解析过程没有产生这样的上下文;只有一个xmlDoc。

【问题讨论】:

  • It looks like xmlReadMemory 与“push”方法一起使用,但您可以将xmlCreateMemoryParserCtxt与“pull”方法一起使用,这将为您提供一个 xmlParserCtxtPtr 。
  • xmlCreateMemoryParserCtx 似乎对我不可用(CentOS 7 默认 libxml2)。有一个 xmlCreateDocParserCtx,我已更改解析以将其与 xmlCtxtReadDoc 一起使用,然后将上下文与 xmlParserFindNodeInfo 和节点一起使用,但结果始终为 NULL。

标签: c xml libxml2


【解决方案1】:

以下代码对我有用(libxml2 文档几乎没有什么可取之处,必须下载源代码并在 lib 中挖掘,直到我理解到足以一起破解它)。关键是:

xmlSetFeature(ctxt, "gather line info", (void *)&v);

这里有一些代码来说明:

const char *xml = ...
xmlParserCtxt *ctxt = NULL;
xmlDoc *doc = NULL;
if (!(ctxt = xmlCreateDocParserCtxt((const unsigned char *)xml)))
    return -1;
int v = 1;
xmlSetFeature(ctxt, "gather line info", (void *)&v);
if (xmlParseDocument(ctxt) == -1)
{
    xmlFreeParserCtxt(ctxt);
    return -1;
}
else
{
    if ((ctxt->wellFormed) || ctxt->recovery)
        doc = ctxt->myDoc;
    else
    {
        xmlFreeParserCtxt(ctxt);
        return -1;
    }
}

// use doc to get a node and then xmlParserFindNodeInfo(ctxt, node)
…

xmlFreeParserCtxt(ctxt);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多