如何在C中创建和管理大型XML文件

时间:2012-02-05 15:03:42

标签: c libxml2

C中用于创建大型XML文件的最佳库是什么。我必须通过读取sqlite3 db中的值来创建一个包含7000多个节点的XML文件。我知道libxml2并且也使用它但是因为它是基于内存的XML解析器,所以我不确定它能够管理这么多的XML节点。是否有任何替代方法或任何其他方式使用libxml2来管理大型XML文件?

2 个答案:

答案 0 :(得分:4)

使用libxml的xmlWriter流API来最大限度地减少内存使用。您可以调用xmlTextWriterStartElementxmlTextWriterWriteAttribute等函数将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("&lt;", stream);
            break;
        case '>':
            status = fputs("&gt;", stream);
            break;
        case '&':
            status = fputs("&amp;", stream);
            break;
        default:
            status = putc(c, stream);
            break;
        }
        if (EOF == status) {
            return -1;
        }
    }
    return 0;
}

上述代码可以很容易地适用于其他用途,例如:写入缓冲区。

此方法的缺点(正如评论部分中的@Matti所指出的)是您必须使用外部工具对您生成的XML进行验证。有许多可用于XML验证的工具,xmllint(作为Libxml2的一部分发布)是我想到的。