2010-09-17 52 views
-3

可能重複:
Why am I getting an 「Out of memory」 error with Perl's XML::Simple?如何使用Perl解析大型XML文件?

我有這樣一個XML文件:

  <message> 
       <c1> 
        <rrcConnectionSetupComplete> 
         <rrc-TransactionIdentifier>2</rrc-TransactionIdentifier> 
         <criticalExtensions> 
          <c1> 
           <rrcConnectionSetupComplete-r8> 
            <selectedPLMN-Identity> 1 </selectedPLMN-Identity> 
            <dedicatedInfoNAS> 07410109014290112345671000028020000f0 </dedicatedInfoNAS> 
           </rrcConnectionSetupComplete-r8> 
          </c1> 
         </criticalExtensions> 
        </rrcConnectionSetupComplete> 
       </c1> 
      </message> 

我使用這樣的Perl代碼訪問XML文件中的數據(我應該堅持這種訪問格式)

#!/usr/bin/perl 

use strict; 

use XML::Simple; 

my $xml = new XML::Simple; 

my $data = $xml->XMLin("uL-DCCH-Message.xml"); 

my $rrc_trans_identifier = $data->{'c1'}->{'rrcConnectionSetupComplete'}->{'rrc-TransactionIdentifier'}; 
print "rrc_trans_id :: $rrc_trans_identifier\n"; 

my $selected_plmn_id = $data->{c1}->{rrcConnectionSetupComplete}->{criticalExtensions}->{c1}->{'rrcConnectionSetupComplete-r8'}->{'selectedPLMN-Identity'}; 
print "plmn identity :: $selected_plmn_id\n"; 

my $rrc_dedicated_info_nas = $data->{c1}->{rrcConnectionSetupComplete}->{criticalExtensions}->{c1}->{'rrcConnectionSetupComplete-r8'}->{dedicatedInfoNAS}; 
print "dedicated info nas :: $rrc_dedicated_info_nas\n"; 

產生的輸出是,使用XML ::簡單工作正常對於較小的XML文件(如圖所示在上述輸出)

rrc_trans_id :: 2 
plmn identity :: 1 
dedicated info nas :: 07410109014290112345671000028020000f0 

Perl代碼。

但是,如果XML文件很大,那麼XML :: Simple將無法處理,並顯示錯誤消息Ran out of memory

是否有任何其他XML解析器可以使用,以便我可以像上面所顯示的類似方式訪問XML文件中的元素?

如果還有其他解析器可用,是否可以通過遵循與XML :: Simple相同的約定來給出示例。

+5

你已經問過這個在http://stackoverflow.com/questions/3726197/why-am-i-getting-an-out-of-memory-error-with-perls-xmlsimple - 請重新 - 讀你在那裏得到的建議。 – Ether 2010-09-17 05:41:44

+0

但我以不明確的方式提出這個問題,這就是爲什麼我再一次詢問確切的場景 – 2010-09-17 06:00:50

+4

所以編輯你的原始問題來澄清。不要垃圾網站。 – Ether 2010-09-17 06:30:09

回答

4

有兩種類型的XML解析器:

  • 簡單那些讀取整個XML 文件到內存中,並生成一個簡單的 訪問的數據結構,這需要 一個相當大的數量的內存,使 你會遇到更大的 文件的問題。他們的優勢在於他們通常很容易處理。

  • 這是基於SAX的解析器,它按元素處理XML元素 。要使用此解析器工作 ,開發人員 (您!)必須爲每個感興趣的元素註冊 的回調,並使用 回調中的信息註冊 。每當SAX解析器 遇到給定元素時,將執行 關聯回調,並且 您只能同時使用 感興趣的標記而不是整個 文件。這個解析器保持 內存使用(可能)非常低,但需要更多的工作。

2

如果文件很大,那麼你應該使用任何基於SAX的解析器或者嘗試使用LibXML解析器。