2

我正在使用 XML::Simple 来解析和编辑一个非常大的 XML 文件,并且速度至关重要(到目前为止,我尝试过的所有方法中 XML::Simple 是最快的)

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

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

我一直在使用:

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

但它似乎不仅是一个极端的 CPU 占用者,而且需要大量的内存来完成。

他们是一种将我的 XML 对象简单地输出为正确的 XML 而没有所有无用空格的方法吗?

谢谢

4

3 回答 3

8

查看 NoIndent 选项:来自 XML::Simple 手册页:

NoIndent => 1 # out - 很少使用

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

NormaliseSpace => 0 │ 1 │ 2 # 派上用场

此选项控制如何处理文本内容中的空白。该选项的公认价值是:

  • 0 =(默认)空白通过未更改的(当然除了 XML 建议强制要求的属性值中的空白规范化)

  • 1 = 空白在用作哈希键的任何值中被标准化(标准化意味着删除前导和尾随空白并将空白字符序列折叠到单个空格)

  • 2 = 空白在所有文本内容中被规范化

    注意:如果这对您来说更自然,您可以使用“z”来拼写此选项。

于 2010-11-08T19:48:00.687 回答
2

只需在对 XMLout() 的调用中设置 NoIndent 选项。像这样:

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

多田!

于 2010-11-08T19:50:01.183 回答
0

事件驱动的 XML 解析器将比需要一次将所有内容加载到内存中的解析器更快。

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

$string =~ s/>\s+</></g;
于 2010-11-08T19:42:54.403 回答