首页 > 解决方案 > XML - 当使用 SAX 而不是 DOC 时,libxml2 返回 XML_ERR_GT_REQUIRED

问题描述

我需要使用 libxml2 来解析超过 400KB 的巨大 xml 数据。据我所知,由于 DOC 不适合大型 xml 数据,我正在尝试使用 SAX 处理程序和 xmlParseChunk。

但是在中间解析 xml 数据时,xmlParseChunk 返回 [73] XML_ERR_GT_REQUIRED。

我一直在尝试将 xmlParserCtxtPtr 与 xmlCreatePushParserCtxt 一起使用。我以为是 xml 数据庞大造成的,所以在 xmlParseChunk 之前尝试了 xmlCtxtUseOptions(ctxt, XML_PARSE_HUGE)。

当 xmlParseChunk 读取 xml 数据时,我还使用了 strlen(chars) 而不是 sizeof(chars)。

但失败了。

感谢cooldaemon@GitHub(https://gist.github.com/cooldaemon/106870),我对他/她的代码进行了几乎相同的尝试。

int read_xmlfile(FILE *f) {
    char chars[1024];
    int res = fread(chars, 1, 4, f);
    if (res <= 0) {
        return 1;
    }

    xmlSAXHandler SAXHander = make_sax_handler();

    xmlParserCtxtPtr ctxt = xmlCreatePushParserCtxt(
        &SAXHander, NULL, chars, res, NULL
    );

    while ((res = fread(chars, 1, sizeof(chars), f)) > 0) {
        if(xmlParseChunk(ctxt, chars, res, 0)) {
            xmlParserError(ctxt, "xmlParseChunk");
            return 1;
        }
    }
    xmlParseChunk(ctxt, chars, 0, 1);

    xmlFreeParserCtxt(ctxt);
    xmlCleanupParser();
    return 0;
}

它通常会解析小于 400KB 的 xml 数据。我怀疑 xmlParseChunk 或由于 xml 数据超过 400KB 而引发错误“XML_ERR_GT_REQUIRED”。

虽然使用 xmlCtxtUseOptions(..., XML_PARSE_HUGE),但我无法解决这个问题。

有人请帮忙。

标签: cparsinglibxml2

解决方案


推荐阅读