2010-11-08 97 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