如何使用 expat 在流中查找 XML 文档的末尾?

How to find the end of an XML document in a stream with expat?

我有一个包含串联 XML 文档的二进制流。 使用这样的调用以任意大小的块处理流:

int expat_status = XML_Parse(parser->expat, buffer, buffer_size, 0);

如何检测到特定数据块包含当前已解析 XML 文档的最后一个字节并检索其位置,以便我可以从下一个字节重新启动解析器以解析下一个 XML 流中跟随的文档?

经过一段时间的尝试,目前我找到的最佳解决方案是监控 XML_Parse 以获取错误代码 XML_ERROR_JUNK_AFTER_DOC_ELEMENT。在这种情况下 XML_GetCurrentByteIndex 可用于获取包含 "junk".

的流中第一个字节的索引

来自 expat 文档(关于 XML_GetCurrentByteIndex 和该组的其他功能):

The position reported is that of the first of the sequence of characters that generated the current event (or the error that caused the parse functions to return 0.)

这个索引是相对于文档流的开头的,所以需要累加后续调用XML_Parse消耗的字节数来计算当前块中额外数据的长度。

然后,可以重新启动解析器并从当前块内的计算位置 运行 开始处理流中紧随其后的另一个 XML 文档。