如何用 C 创建和管理大型 XML 文件
创建大型 XML 文件的最佳 C 库是什么?我必须通过从 sqlite3 数据库读取值来创建具有超过 7000 个节点的 XML 文件。我了解 libxml2 并且也使用过它,但由于它是一个基于内存的 XML 解析器,我不确定它能够如何很好地管理如此大量的 XML 节点。是否有任何替代方法或任何其他方式使用 libxml2 来管理巨大的 XML 文件?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 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.
如果速度和内存使用是您最关心的问题,那么最佳解决方案可能是使用
stdio.h
函数以及一个函数来转义 XML 实体。此函数应该足以将转义字符串打印到 C 流:
上面的代码可以轻松地适应其他用途,例如写入缓冲区。
这种方法的一个缺点(正如 @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:
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.