最佳的XML压缩算法?

时间:2009-07-04 14:17:14

标签: xml algorithm text compression zip

我几乎不知道有关压缩的事情,所以忍受我(这可能是一个愚蠢而痛苦的明显问题)。

所以我想说我有一个带有几个标签的XML文件。

<verylongtagnumberone>
  <verylongtagnumbertwo>
    text
  </verylongtagnumbertwo>
</verylongtagnumberone>

现在假设我的多个XML文件中有许多这些非常长的标签,其中包含许多属性。我需要将它们压缩到尽可能小的尺寸。最好的方法是使用特定于XML的算法,该算法为vlt1或vlt2分配单个标签假名。然而,这并不像我想要的那样“开放”,我想使用像DEFLATE或LZ这样的常用算法。如果存档是.zip文件,它也会起作用。

由于我正在处理纯文本(没有像图像这样的二进制文件),我想要一个适合纯文本的算法。哪一个产生最小的文件大小(首选无损算法)?

顺便说一下,场景是这样的:我正在为包含XML文件的文档(如ODF或MS Office XML)创建一个标准,打包在.zip中。

编辑:'加密'是一个错字;它应该是'压缩'。

8 个答案:

答案 0 :(得分:31)

有一个名为EXI (Efficient XML Interchange)的W3(尚未发布)标准。

应该成为将来压缩XML数据的数据格式(声称是最后一种必要的二进制格式)。针对XML进行优化,它比任何传统压缩算法更有效地压缩XML。

使用EXI,您可以动态操作压缩的XML数据(无需解压缩或重新压缩)。

EXI =(XML + XMLSchema)as binary。

在这里你使用开源实现(不知道它是否已经稳定):
Exificient

答案 1 :(得分:6)

是的,* .zip在实践中最好。 this USENIX paper 中包含的Gory deets显示&#34;最佳&#34;压缩机不值得计算成本和特定领域的压缩机[平均]不会打败拉链。

免责声明:我写过这篇论文,据谷歌引用了60多次。

答案 2 :(得分:5)

“压缩”XML的另一种替代方法是FI(Fast Infoset)。

存储为FI的XML只包含一次的每个标记和属性, 所有其他事件都引用第一个, 从而节省空间。

请参阅:

Very good article on java.sun.com,当然还有 the Wikipedia entry

从压缩的角度来看,与EXI的区别在于Fast Infoset (结构明文)效率较低。

其他重要区别 是:FI是一个成熟的标准,有许多实现 其中之一:Fast Infoset Project @ dev.java.net

答案 3 :(得分:2)

您似乎对压缩而不是加密更感兴趣。是这样的吗?如果是这样,this可能会被证明是一个有趣的读物,即使它不是一个精确的解决方案。

答案 4 :(得分:1)

  

顺便说一下,场景是这样的:我正在创建一个包含XML文件的文档标准,如ODF或MS Office XML,打包在 .zip 中。

然后我建议您使用.zip压缩,否则您的用户会感到困惑。

答案 5 :(得分:0)

我希望我能正确理解你需要做什么...... 我想说的第一件事就是压缩没有好坏 用于文本的algorithmss - zip,bzip,gzip,rar,7zip足以压缩 任何具有低entpy的东西 - 即具有小字符集的大文件。 如果我必须使用它们,我会选择7zip作为我的第一选择,rar as 第二个和第三个拉链。但差异非常小,所以你应该尝试 对你来说更轻松 第二 - 我无法理解你要加密的是什么。假设 这是一个XML文件,然后您应该首先使用您喜欢的压缩它 压缩算法,然后使用您最喜欢的加密对其进行加密 算法。在大多数情况下,任何现代算法都在PGP中实现 对任何事情都足够安全。 希望有所帮助。

答案 6 :(得分:0)

您的替代方案是:

  • 使用支持gzip压缩的网络服务器。它会自动压缩所有传出的HTML。但是有一点小小的惩罚。
  • 使用像JSON这样的东西。它将大大减少消息的大小
  • 还有一个二进制XML,但我自己没有尝试过。

答案 7 :(得分:0)

没有一个默认值是理想的XML,但由于存在大量可重复性,因此您仍然可以获得良好的值。

因为XML使用了很多重复(标记。&gt;),所以你希望这些重复不到一点,所以某种形式的算术而不是霍夫曼编码。所以rar / 7zip在理论上应该明显更好。这些算法提供高压缩,因此速度较慢。理想情况下,您需要使用算术编码器进行简单压缩(对于XML来说,它会很快并且可以提供高压缩率)。