XML的最佳压缩算法是什么?

36

我对压缩几乎一无所知,所以请容忍我(这可能是一个愚蠢和非常明显的问题)。

假设我有一个带有几个标签的XML文件。

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

现在假设我有很多这样的长标签,并且在我的多个 XML 文件中有许多属性。我需要将它们压缩到最小的尺寸。最好的方法是使用一个 XML 特定的算法,为单个标签分配类似 vlt1 或 vlt2 的伪名称。然而,这不是一种“开放”的方式,而我希望使用像 DEFLATE 或 LZ 这样的常见算法。如果存档是 .zip 文件,则也会有所帮助。

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

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

编辑:'加密'这件事是一个打字错误;应该是 '压缩'。


4
这与加密有什么关系?简单的答案是使用ZIP进行压缩:它广泛可用,在文本方面表现良好,不值得花时间去寻找“最小尺寸”。 - kdgregory
为什么不直接使用OpenXML呢?它基本上就是你想要的 :). 不确定它是否是最好的压缩方式,但我到目前为止很喜欢它。如果你还不知道,OpenXML基本上就是一个zip文件,所以你可以将Office 2007文档重命名为.zip文件(即将something.docx重命名为something.zip),然后作为zip文件打开它。里面基本上是一堆XML文件。 - Jimmy Chandra
你可以简单地使用一个Zip文件中的一堆XML文件,以及任何文件扩展名。为什么要使用非常长的标签号码呢? - Osama Al-Maadeed
'ave'和'ben'是打字错误。使用'encryption'而不是'compression'是一个错误。 - MrFox
8个回答

35

有一个W3(尚未发布)标准名为EXI(高效XML交换)

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

使用EXI,您可以即时处理压缩的XML数据(无需解压缩或重新压缩它)。

EXI =(XML + XMLSchema)作为二进制。

这里提供了开源实现(不知道是否已经稳定):
Exificient


6
XML是因为“二进制文件很糟糕”而设计的。现在我们有了EXI。这证明XML只是在重复造轮子。难道我们不应该使用ASN.1吗? - J-16 SDiZ
7
ASN.1的某些低劣部分被选为EXI的候选项。二进制文件是邪恶的。EXI并不是通常意义上的二进制文件。你不需要编写自己的实现来读/写这个二进制文件,也不需要定义自己的结构和类型系统。所有这些都由XML+XmlSchema为您完成了。 - ivan_ivanovich_ivanoff

9

是的,*.zip 是最佳实践。在这篇USENIX论文中包含了详细信息,显示出“最优”压缩器不值得计算成本,而特定领域的压缩器平均无法击败zip。

免责声明:我撰写了该论文,并根据谷歌引用已被引用60多次。


6

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

将XML存储为FI,每个标签和属性仅包含一次,所有其他出现都引用第一个,从而节省空间。

请参见:

非常好的java.sun.com文章,当然还有
维基百科条目

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

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


1
我们应该提到的是,EXI胜过FI的原因在于,当存在模式时,它可以将标签和属性出现零次而不是一次。 - Steven Sudit

2

看起来你对压缩比加密更感兴趣。是这样吗?如果是的话,这篇文章可能会很有意思,尽管它并不是一个完美的解决方案。


旧链接似乎已经失效了;新链接由archive.org和google提供:http://gnosis.cx/publish/programming/xml_matters_13.html - unbob

1
顺便说一下,情景是这样的:我正在创建一个文档标准,类似于ODF或MS Office XML,其中包含XML文件,以.zip打包。那么我建议您使用.zip压缩,否则您的用户会感到困惑。

是的,再加上压缩XML也不会产生更进一步的压缩。 - Steven Sudit

0

我希望我正确理解了您需要做的事情... 首先,我想说的是,在文本压缩方面没有好的或坏的算法 - zip、bzip、gzip、rar、7zip足以压缩任何具有低熵即小字符集的大文件。如果我必须使用它们,我会选择7zip作为第一选择,rar作为第二选择,zip作为第三选择。但差异非常小,所以您应该尝试任何对您来说更容易的方式。 其次-我不能理解您试图加密什么。假设这是一个XML文件,然后你应该先使用你喜欢的压缩算法将其压缩,然后再使用你喜欢的加密算法进行加密。在大多数情况下,例如在PGP中实现的任何现代算法都足够安全。 希望这可以帮助到您。


一个答案里有签名!这可真新鲜 ;) - ivan_ivanovich_ivanoff

0

您的替代方案有:

  • 使用支持gzip压缩的web服务器。它将自动压缩所有出站HTML内容,但会有一些CPU开销。
  • 使用JSON之类的东西。它将大幅减少消息的大小。
  • 还有一种二进制XML,但我自己没有尝试过。

JSON 确实不比 XML 更小。 - Brady Moritz

0

默认的选项对于XML来说都不是理想的,但由于有很多重复的内容,你仍然会得到不错的值。

因为XML使用了很多重复的元素(标签和大于号),所以你希望这些元素的压缩比特数尽量少,而不是使用Huffman编码。因此,rar/7zip在理论上应该更好一些...这些算法提供了高压缩率,但速度较慢。理想情况下,你希望使用一种简单的压缩方法,配合算术编码器(对于XML来说,这将快速且具有高压缩率)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接