C中用于创建大型XML文件的最佳库是什么。我必须通过读取sqlite3 db中的值来创建一个包含7000多个节点的XML文件。我知道libxml2并且也使用它但是因为它是基于内存的XML解析器,所以我不确定它能够管理这么多的XML节点。是否有任何替代方法或任何其他方式使用libxml2来管理大型XML文件?
答案 0 :(得分:4)
使用libxml的xmlWriter流API来最大限度地减少内存使用。您可以调用xmlTextWriterStartElement,xmlTextWriterWriteAttribute等函数将XML直接写入文件或其他输出,而不是在内存中构建节点树。
它具有与“just use printf”式解决方案类似的用法,具有仍然使用实际XML库的MAJOR优势,因此它可以为您提供所有的麻烦。
您可以在example usage页面上找到libxml2 examples。
答案 1 :(得分:2)
如果您最关心速度和内存使用情况,那么最佳解决方案可能是使用stdio.h
函数以及函数来转义XML entities。
此功能应足以将转义字符串打印到C流:
int xml_puts(const char *string, FILE *stream)
{
int i = 0, c, status;
while ((c = string[i++])) {
switch (c) {
case '"':
status = fputs(""", stream);
break;
case '\'':
status = fputs("'", stream);
break;
case '<':
status = fputs("<", stream);
break;
case '>':
status = fputs(">", stream);
break;
case '&':
status = fputs("&", stream);
break;
default:
status = putc(c, stream);
break;
}
if (EOF == status) {
return -1;
}
}
return 0;
}
上述代码可以很容易地适用于其他用途,例如:写入缓冲区。
此方法的缺点(正如评论部分中的@Matti所指出的)是您必须使用外部工具对您生成的XML进行验证。有许多可用于XML验证的工具,xmllint
(作为Libxml2的一部分发布)是我想到的。