Text :: Balanced和multiline xml

时间:2011-08-23 19:25:16

标签: xml perl

好像我有点失落。

我需要解析一个大的(大约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的答案很接近,它确实会检索一些数据,但如果顶级标签丢失则不会。

2 个答案:

答案 0 :(得分:6)

对于损坏的XML,我会尝试将recover选项设置为XML::LibXML。它使它忽略解析错误并继续。

答案 1 :(得分:4)

使用Text::Balanced进行XML解析就像使用瑞士刀进行心脏直视手术一样 - 只是因为你能做到并不意味着你应该这样做。

如果XML::Parser给您带来困难,请尝试使用较新的XML解析库,例如XML::LibXMLXML::Twig