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

发布于 2025-01-03 00:45:37 字数 184 浏览 0 评论 0 原文

创建大型 XML 文件的最佳 C 库是什么?我必须通过从 sqlite3 数据库读取值来创建具有超过 7000 个节点的 XML 文件。我了解 libxml2 并且也使用过它,但由于它是一个基于内存的 XML 解析器,我不确定它能够如何很好地管理如此大量的 XML 节点。是否有任何替代方法或任何其他方式使用 libxml2 来管理巨大的 XML 文件?

What is the best library in C to create large XML files. I have to create a XML files with more than 7000 nodes by reading values from a sqlite3 db. I know about libxml2 and also used it but since its a memory based XML parser I'm not sure how well it can manage this huge number of XML nodes. Is there any alternative or any other way to use libxml2 to manage huge XML files?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仅此而已 2025-01-10 00:45:37

使用 libxml 的 xmlWriter 流 API 来最大限度地减少内存使用。您不是在内存中构建节点树,而是调用诸如 xmlTextWriterStartElement 之类的函数, xmlTextWriterWriteAttribute 等将 XML 直接写入文件或其他文件 输出。

它的用法与“仅使用 printf”式解决方案类似,其主要优点是仍然使用实际的 XML 库,因此它会为您解决所有麻烦。

您可以在示例用法页面上找到示例用法。 org/examples/index.html" rel="nofollow">libxml2 示例。

Use libxml's xmlWriter streaming API to minimize your memory use. Rather than building up a tree of nodes in memory, you call functions like xmlTextWriterStartElement, xmlTextWriterWriteAttribute, etc. to write your XML directly to a file or other output.

It has similar usage as the "just use printf"-style solutions, with the MAJOR advantage of still using an actual XML library, so it takes care of all the nastiness for you.

You can find an example usage on the page of libxml2 examples.

℉絮湮 2025-01-10 00:45:37

如果速度和内存使用是您最关心的问题,那么最佳解决方案可能是使用 stdio.h 函数以及一个函数来转义 XML 实体

此函数应该足以将转义字符串打印到 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 的一部分发布)是我想到的一个。

If speed and memory usage are you biggest concern then the optimal solution is probably using the stdio.h functions along with a function to escape the XML entities.

This function should be sufficient for printing an escaped string to a C stream:

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;
}

The above code can easily be adapted for other uses, e.g. writing to a buffer.

A drawback with this method (as pointed out by @Matti in the comments section) is that you will have to use external tools to do validation on the XML you produce. There are various tools available for XML validation, xmllint (released as a part of Libxml2) is one that comes to mind.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文