XML — libxml2 возвращает XML_ERR_GT_REQUIRED при использовании SAX не DOC

#c #parsing #libxml2

#c #синтаксический анализ #libxml2

Вопрос:

Мне нужно проанализировать огромные XML-данные размером более 400 КБ, используя libxml2. Как я знаю, поскольку DOC не подходит для огромных XML-данных, я пытаюсь использовать обработчик SAX и xmlParseChunk.

Но при разборе в середине xml-данных xmlParseChunk возвращает [73] XML_ERR_GT_REQUIRED.

Я пытался использовать xmlParserKtxtPtr с xmlCreatePushParserKtxt. Я думал, что это вызвано огромными данными xml, поэтому я попробовал xmlCtxtUseOptions (ctxt, XML_PARSE_HUGE) перед xmlParseChunk.

Я также использовал strlen (символы) вместо sizeof (символы), когда xmlParseChunk считывает XML-данные.

Но не удалось.

Спасибо 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(
        amp;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;
}
  

Обычно он анализирует XML-данные размером менее 400 КБ.
Я подозреваю, что xmlParseChunk или что-то еще выдает ошибку ‘XML_ERR_GT_REQUIRED’ из-за xml-данных размером более 400 КБ.

Несмотря на использование xmlCtxtUseOptions (…, XML_PARSE_HUGE), я не могу решить эту проблему.

Кто-нибудь, пожалуйста, помогите.

Комментарии:

1. Взглянув на перечисление xmlParserOptions, которое также есть XML_PARSE_BIG_LINES , добавьте его и сообщите результаты. Предполагая, что сгенерировано 400 МБ xml, вы могли бы попробовать разделить xml на несколько файлов, а затем поместить их в один документ, используя XInclude.

2. Я уже добавил опцию следующим образом xmlCtxtUseOptions(ctxt, XML_PARSE_HUGE|XML_PARSE_BIG_LINES); , но это приводит к тому же. На самом деле, я пытаюсь разделить xml на несколько файлов, но я столкнулся с проблемой, xmlParseChunk не может проанализировать другие файлы из-за несоответствия элементов между start и end, что возвращает [76] XML_ERR_TAG_NAME_MISMATCH. XInclude — это новость для меня, не могли бы вы, пожалуйста, показать мне несколько ссылок для ссылки?

3. Грустное лицо. Конечно, вот как это используется в вашем документе , вот один пример того, как это обработать . Однако, в зависимости от того, в чем заключается проблема underlyng (длинные строки, много строк, большие файлы, другое), вы можете захотеть обработать XIncludes более разумным способом.