2010-11-08 133 views
2

我使用XML ::简单的解析和编辑非常大的XML文件,速度是至关重要的(到目前为止,所有的方法的我都试过XML ::简单一直是最快)如何从XML :: Simple :: XMLout压缩XML?

现在,一旦我所有的编辑完成我使用XMLout()将XML打印到文档中,尽管它使用正确的缩进打印它,如果这是人类阅读的,但是在我的情况下完全没有用处,这很好。

没有空白的输出文件是1.2 Mb,空白区是15 Mb。

我一直在使用:

my $string = XMLout($data); 
$string =~ s/>[\s]*</></g; 
print $out $string; 

但它似乎不仅是一个极端的CPU生猪和需要的存储大量的做。

他们的方式是简单地输出我的XML对象作为正确的XML没有所有无用的空白?

感谢

回答

8

看noindent,会选择:从XML ::简单的手册页:

noindent,会=> 1#出来 - 很少使用

将此选项设置为1,禁用“ XMLout()“的默认'漂亮 打印'模式。启用此选项后,XML输出将全部在一行(除非数据中有换行符) - 所有 - 这可能是 更容易进行下游处理。

NormaliseSpace => 0│1│2#在 - 得心应手

此选项控制如何在文本内容中的空格来处理。 为选项识别的值为:

  • 0 =(默认)空白是通过未改变的传递(当然除了为空白的在 属性值的归一化其由XML建议规定的)

  • 1 =空白被用作散列密钥的任何值归一化(归一化装置去除的前缘和后whites- 步伐和折叠的空白字符序列为单个空格)

  • 2 =在所有文本内容中对空格进行了标准化

    注意:如果您对此更自然,则可以使用'z'拼写此选项 。

+0

非常感谢,这正是我所需要的 – 2010-11-08 19:53:58

0

一个事件驱动的XML解析器会比一些需要整个事情加载到内存中一次更快。

你不应该在你的模式中做太多额外的工作!试试这个:

$string =~ s/>\s+</></g; 
+0

我已经读过事件驱动会好得多,但我试图将决策树计数器存储到一个文件中(基本上试图监视用户通过应用程序访问什么路径),并且我需要能够方便快捷地检查一个元素的孩子......我不认为使用流解析器很容易。 (请纠正我,如果我错了) – 2010-11-08 19:50:16

+0

不,我不认为你有麻烦决定儿童与流解析器错了。但我自己只使用过'XML :: Simple'。为了减小一个非常大的数据流的大小,我已经找到合理的记录界限来分解输入数据流,所以它一次不会在内存中占用过多的空间。 – tchrist 2010-11-08 19:55:33

+0

如果整个文档适合内存,那么使用XML :: LibXML会比其他选项更快。这是因为DOM数据结构由C代码管理,并且通常没有太多数据穿过Perl API。另一方面,SAX API需要为每个事件创建和销毁大量的Perl数据结构。 SAX是理论上最好的事情之一。如果整个文档不适合内存,那么如果使用XML :: LibXML :: Reader提供的'pull'API(不是我曾经这么做过),那么XML :: LibXML仍然是一个不错的选择。 – 2010-11-10 03:38:59

2

在通话只需设置noindent,会选项XMLout()。像这样:

my $string = XMLout($data, NoIndent=>1); 

Tada!

+0

你真是太神奇了,谢谢你,不知道我在文档中没有看到 – 2010-11-08 19:51:29