压缩XML的最佳方法

12

我需要将一个非常大的XML文件压缩到最小的可能大小。

我使用C#,并且希望它是一些开源或应用程序,我可以通过我的代码访问,但是我也可以处理算法。

谢谢!


1
我会尝试使用Zlib。但可能有基于模式的XML到二进制转换器。 - Pavel Radzivilovsky
8个回答

11

虽然可能不是最小的尺寸,但您可以使用 System.IO.Compression 进行压缩。对于文本,压缩通常提供非常好的压缩效果。

using (var fileStream = File.OpenWrite(...))
using (var zipStream = new GZipStream(fileStream, CompressionMode.Compress))
{
    zipStream.Write(...);
}

7
如上所述,高效XML交换(EXI)一直以来都实现了最佳的可用XML压缩。即使没有模式,EXI通常比zip小2-5倍也并非罕见。如果有模式,你会做得更好。
如果您不反对商业实现,可以使用高效XML的.NET版本,并使用标准.NET API直接从C#代码调用它。您可以从http://www.agiledelta.com/efx_download.html下载免费试用版。

4

在我的情况下,xmlppm 的压缩比 EXI 更好。 - ManuelAtWork

4
如果您有可用于XML文件的模式,您可以尝试EXIficient。它是高效XML交换(EXI)格式的实现,是目前最好的通用XML压缩方法。如果您没有模式,EXI仍然比常规zip(即deflate算法)更好,但对于大型文件来说并不是非常好。
EXIficient仅适用于Java,但您可能可以将其制作成可调用的应用程序。我不知道是否有任何C#中的开源实现EXI。

3
文件大小并不是EXI(或任何二进制方案)的唯一优点。读/写时,处理时间和内存开销也大大降低。想象一个程序通过简单地复制字节将浮点数字复制到磁盘上。现在想象另一个程序将浮点数字转换为格式化文本,并将它们粘贴到文本流中,然后将该流通过昂贵的压缩算法传输。由于这种荒谬的开销,XML基本上无法用于非常庞大的文件,这些文件可以通过二进制表示轻松处理。

二进制XML承诺解决XML的这个长期弱点。很容易制作一个工具,在不知道XML模式的情况下,在二进制/文本表示之间进行转换,这意味着您仍然可以轻松编辑文件。


2

XML非常易于压缩。您可以使用DotNetZip从XML生成压缩的zip文件。


可能是因为这几乎是一个仅包含链接的答案,而且链接已经失效了。 - Sebastian Hofmann

2

如果您需要最大压缩级别,我建议使用LZMA。这是开源7-Zip项目的一部分,包括C#的SDK,可以在这里找到。


你可以使用XML特定的压缩算法来获得更好的效果。 - vy32

2

如果您想要尽可能小的文件大小,那么可以尝试使用Fast Infoset作为二进制XML编码,然后使用BZIP2或LZMA进行压缩。与压缩文本XML或使用EXI相比,您可能会获得更好的结果。FastInfoset.NET包括Fast Infoset标准的实现和多种可选的压缩格式,但是它是商业软件。


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