2011-08-23 62 views
3

好像我有點失落。Text ::平衡和多線xml

我需要解析一個大的(約100 MB)和相當醜陋的XML文件。如果我使用parsefile,它會返回錯誤(文檔元素後的垃圾),但它會愉快地解析文件的較小元素。

所以我決定把文件分解成元素並解析它們。由於用正則表達式解析XML是不鼓勵的(嗯,無論如何我都試過了,但是我得到了重複的結果),我試過Text::Balanced

喜歡的東西

use Text::Balanced qw/extract_tagged/; 

while (<FILE>) { 
    my $result = extract_tagged($_, "<tag>"); 
    print $result if defined $result; 
} 

作品就好了,這樣我就可以提取其放入一個線標記的條目。隨着更大的東西,但是

use Text::Balanced qw/extract_tagged/; 
use File::Slurp; 

my $test = read_file("file"); 
my $result = extract_tagged($text, "<tag>"); 
print $result; 

不起作用。它讀取文件,但無法在其中找到加標籤的項目。

所以問題是我如何提取給定標籤之間的任何東西沒有XML::Parser?如果可能的話,我真的很需要避免咀嚼它。

P.S.搜索將返回正則表達式指南,heredoc howtos和任何東西,但我尋找

P.P.S.我是一個白癡,一直試圖解析一個無效的文件。如果分析器失敗,仍然很好奇如何切割文件。


bvr的答案很接近,它確實會檢索一些數據,但如果頂級標記丟失則不會。

回答

6

一個新的XML解析庫對於破損的XML,我會嘗試設置recover選項XML::LibXML。它使它忽略解析錯誤並繼續。

+0

非常Perl的方式回答:你明白你的意思。我將運行帶有恢復模式的解析器來對付損壞的文件,如果它設法提取信息,我將其標記爲答案。 –

4

使用Text::Balanced進行XML解析就像使用瑞士刀進行心臟直視手術 - 僅僅因爲您可以做到這一點並不意味着您應該這樣做。

如果XML::Parser是給你一個困難時期,嘗試像XML::LibXMLXML::Twig

+0

XML :: Twig返回與XML :: Parser(它基於的)相同的錯誤,而XML :: LibXML對我來說似乎太複雜了。我想將文件拆分成更小的部分並解析它們。 –

+0

Ooops。好像我超級愚蠢。我搞砸了文件 - 從頂層開始標記切掉 - 並試圖分析損壞的XML。對我感到羞恥!仍然想知道如何'砍'一個XML文件,以防萬一我不得不處理損壞的XML文件。 –