2010-01-06 119 views
11

我需要将非常大的xml文件压缩到最小的可能大小。压缩XML的最佳方法

我在C#中工作,我宁愿它是一些开源或应用程序,我可以访问通过我的代码,但我能处理的算法,以及。

谢谢!

+1

我会尝试Zlib。但是可能会有基于模式的XML到二进制转换器。 – 2010-01-06 11:50:34

回答

1

XML是高度可压缩的。您可以使用DotNetZip从您的XML生成压缩的zip文件。

+0

@Downvoter - 关注评论? – Oded 2011-02-12 19:32:08

10

它可能不是“最小尺寸可以”压缩它,但你可以使用使用System.IO.Compression对其进行压缩。压缩往往能够为文本提供非常好的压缩。

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

如果您需要最大的压缩级别,我会推荐LZMA。有一个SDK(包括C#),它是开源7-Zip项目的一部分,可用于here

+0

对于特定于XML的压缩算法,您可以做得更好。 – vy32 2011-02-12 18:19:15

3

如果您有可用于XML文件的模式,你可以尝试EXIficient。它是Efficient XML Interchange(EXI)格式的实现,它几乎是最好的通用XML压缩方法。如果你没有一个模式,EXI仍然比普通的zip(即deflate算法)要好,但不是很多,特别是对于大文件。

EXIficient仅仅是Java,但你或许可以把它变成可以调用的应用程序。我不知道C#中EXI的任何开源实现。

6

如上所述,Efficient XML Interchange(EXI)可以非常一致地实现最佳的可用XML压缩。即使没有模式,EXI比拉链小2-5倍并不罕见。有了模式,你会做得更好。

如果你不反对商业实现,你可以用高效的XML的.NET版本,并使用标准的API .NET直接从C#代码调用它。您可以从http://www.agiledelta.com/efx_download.html下载免费试用版本。

2

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

二进制XML有望解决XML这一长期存在的弱点。在二进制/文本表示之间进行转换(不知道XML模式)是非常容易的,这意味着您仍然可以在需要时轻松编辑这些文件。

1

如果您正在寻找尽可能小的尺寸,然后尝试的Fast Infoset二进制XML编码,然后通过压缩BZIP2和LZMA。您可能会获得比压缩文本XML或使用EXI更好的结果。 FastInfoset.NET包括快速信息集标准的实现和几种可供选择的压缩格式,但它是商业的。