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

如何在C语言中创建和管理大型XML文件,c,libxml2,C,Libxml2,在C语言中,创建大型XML文件的最佳库是什么。我必须通过从sqlite3数据库读取值来创建一个包含7000多个节点的XML文件。我知道libxml2,也使用过它,但由于它是一个基于内存的XML解析器,我不确定它能管理这么多XML节点。使用libxml2管理庞大的XML文件是否有其他替代方法?如果速度和内存使用是您最关心的问题,那么最佳的解决方案可能是使用stdio.h函数和一个函数来逃避这个问题 此函数应足以将转义字符串打印到C流: int xml_puts(const char *string

在C语言中,创建大型XML文件的最佳库是什么。我必须通过从sqlite3数据库读取值来创建一个包含7000多个节点的XML文件。我知道libxml2,也使用过它,但由于它是一个基于内存的XML解析器,我不确定它能管理这么多XML节点。使用libxml2管理庞大的XML文件是否有其他替代方法?

如果速度和内存使用是您最关心的问题,那么最佳的解决方案可能是使用
stdio.h
函数和一个函数来逃避这个问题

此函数应足以将转义字符串打印到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;
}
int xml_put(常量字符*字符串,文件*流)
{
int i=0,c,状态;
while((c=string[i++])){
开关(c){
案例'':
状态=FPUT(“”,流);
打破
案例'\'':
状态=fputs(“&apos;”,流);
打破
案例“”:
状态=FPUT(“”,流);
打破
案例“&”:
状态=FPUT(“&;”,流);
打破
违约:
状态=putc(c,流);
打破
}
如果(EOF==状态){
返回-1;
}
}
返回0;
}
上述代码可以很容易地适应其他用途,例如写入缓冲区

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

使用libxml的流式API来最小化内存使用。与在内存中建立节点树不同,您可以调用函数(如等)将XML直接写入文件或其他输出

它的用法与“justuseprintf”风格的解决方案类似,主要优点是仍然使用实际的XML库,因此它为您解决了所有的麻烦


您可以在的页面上找到。

7000节点本身并不是非常“庞大”。如果您直接从数据库格式转换为XML,则
printf
是一个不错的选择。编写XML并不需要XML解析器。@Mike:我希望这是
printf
结合了一些特殊的XML格式characters@Matti:只有五个字符要转义。。。你可能不需要图书馆来处理这个问题。如果你愿意,我可以在回答部分为你写一个函数。@Mike:在我们得到另一个不能生成有效XML的“XML软件”之前,我只是说。我建议
putc
over
fputc
,以防止函数调用开销。这听起来有点简单,我将尝试一下。谢谢:)