2

我的要求是在开始解析之前将 xml 文件压缩成二进制格式,传输并解压缩(快速)。

有相当多的二进制 xml 协议和工具可用。与其他人相比,我发现 EXI(高效的 xml 交换)更好。尝试了它的开源版本 Exificient 并发现它很好。

我听说过 google protocol buffers 和 facebook's thrift,谁能告诉我这两个是否能完成我正在寻找的工作?

或者只是让我知道是否有比 EXI 更好的东西我应该寻找。

此外,与 DOM、SAX 和 Stax 相比,有一个很好的 XML 解析器 VTD-XML(我自己没有尝试过,只是用谷歌搜索并阅读了一些文章)可以实现更好的解析性能。

我想要两全其美,最佳压缩+最佳解析性能,有什么建议吗?

关于 EXI 的另一件事是,EXI 如何声称能够快速解析解码的 XML 文件?因为它正在被 DOM、SAX 或 Stax 解析?如果有另一个二进制解析器用于读取解码版本,我会相信这是真的。如果我错了,请纠正我。

另外,EXI 格式有什么好的 C++ 开源实现吗?EXIficient 提供了 java 版本,但我无法发现 C++ 开源实现?

有一个敏捷三角洲,但那是商业的。

4

3 回答 3

3

你提到了协议缓冲区(protobuf);这是一种二进制格式,但与 XML 没有直接关系。特别是,没有成员名称(元素名称/属性名称/名称空间)被编码 - 它只是数据(带有数字标记的标识符)。

因此,除非您已经知道如何映射“字段 3”等,否则您无法从 protobuf 流中重建任意 XML。

然而!如果你有一个对象模型同时适用于 XML 和 protobuf,那么转换是微不足道的;使用任一反序列化 - 使用任一序列化。效果如何取决于实施;例如,它对 protobuf-net 来说是微不足道的,实际上是我执行 codegen 的方式(加载二进制文件;编写为 XML;通过 xslt 层运行 XML 以发出代码)。

如果您实际上只是想传输对象数据(而 XML 只是一个提议的实现细节),那么我彻底推荐 protobuf;独立于平台,实现范围广泛,版本容错,输出非常小,读写处理速度非常快。

于 2011-05-04T18:08:48.743 回答
3

纳迪姆,

这些都是非常好的问题。您可能是该领域的新手,但 XML 资深人士经常会问同样的问题。我将尝试解决每个问题。

我听说过 google protocol buffers 和 facebook's thrift,谁能告诉我这两个是否能完成我正在寻找的工作?

正如 Marc 所提到的,Protocol Buffers 和 Thrift 是二进制数据格式,但它们不是设计用于传输 XML 数据的 XML 格式。例如,它们不支持名称空间、属性等 XML 概念,因此 XML 和这些二进制格式之间的映射需要您做一些工作。

或者只是让我知道是否有比 EXI 更好的东西我应该寻找。

EXI 可能是您最好的选择。W3C 完成了对 XML 格式实现的相当彻底的分析,发现 EXI 实现(Efficient XML)始终实现了最好的紧凑性,并且是最快的之一。他们还发现它始终比 GZIP 压缩甚至像 ASN.1 PER 这样的打包二进制格式(参见W3C EXI 评估)实现了更好的紧凑性。其他 XML 格式都无法做到这一点。在我看到的比较 EXI 和 Protocol Buffers 的测试中,EXI 至少小了 2-4 倍。

我想要两全其美,最好的压缩+最好的解析性能,有什么建议吗?

如果可以选择,您可能需要考虑商业产品。上面提到的 W3C EXI 测试使用了Efficient XML,它比 EXIficient 快得多(有时解析速度快 >10 倍,序列化速度快 >20 倍)。您的里程可能会有所不同,因此如果可以选择,您应该自己测试。

关于 EXI 的另一件事是,EXI 如何声称能够快速解析解码的 XML 文件?

EXI 可以比 XML 更小更快解析的原因是因为 EXI 可以通过标准 XML API 直接流入/流出内存,而无需生成中间 XML 格式的数据。因此,不是通过标准 API 将您的数据序列化为 XML,而是压缩 XML、发送压缩的 XML、在另一端解压缩 XML,然后通过 XML API 之一对其进行解析……您可以直接序列化您的数据通过标准 XML API 作为 EXI,发送 EXI,然后直接通过另一端的 XML API 解析 EXI。这是压缩和 EXI 之间的根本区别。EXI 本身不是压缩——它是一种更高效的 XML 格式,可以直接流入/流出您的应用程序。

希望这可以帮助!

于 2011-05-14T22:19:14.953 回答
0

压缩与EXI格式的语法系统统一。当您让解码器处理 EXI 流时,解码器 API 通常会为您提供一系列事件,例如 SAX 事件,但是,解码器不会在内部将 EXI 转换回 XML 文本以馈送到另一个解析器。相反,解码器执行所有复杂的解压缩/扫描过程以产生 API 事件序列,例如 SAX。因为 EXI 和 XML 在事件级别是兼容的,所以在给定事件序列的情况下写出 XML 文本是相当简单的。

于 2011-05-05T04:26:31.327 回答