2011-08-23 64 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文件。 –