#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 более разумным способом.