我正在使用XML::Twig
解析一个非常大的XML文档。我想根据<change></change>
标签将它分成块。如何加速XML :: Twig
现在我有:
my $xml = XML::Twig->new(twig_handlers => { 'change' => \&parseChange, });
$xml->parsefile($LOGFILE);
sub parseChange {
my ($xml, $change) = @_;
my $message = $change->first_child('message');
my @lines = $message->children_text('line');
foreach (@lines) {
if ($_ =~ /[^a-zA-Z0-9](?i)bug(?-i)[^a-zA-Z0-9]/) {
print outputData "$_\n";
}
}
outputData->flush();
$change->purge;
}
眼下这个运行parseChange
方法时,它拉从XML该块。这是非常缓慢的。我测试了它与从$/=</change>
的文件读取XML并编写一个函数来返回XML标记的内容,它的速度更快。
有什么我不知道或者我错误地使用了XML::Twig
?我是Perl的新手。
编辑:这是从更改文件的示例更改。该文件包含了很多其他后这些一个正确的和不应该有它们之间的任何东西:
<change>
<project>device_common</project>
<commit_hash>523e077fb8fe899680c33539155d935e0624e40a</commit_hash>
<tree_hash>598e7a1bd070f33b1f1f8c926047edde055094cf</tree_hash>
<parent_hashes>71b1f9be815b72f925e66e866cb7afe9c5cd3239</parent_hashes>
<author_name>Jean-Baptiste Queru</author_name>
<author_e-mail>[email protected]</author_e-mail>
<author_date>Fri Apr 22 08:32:04 2011 -0700</author_date>
<commiter_name>Jean-Baptiste Queru</commiter_name>
<commiter_email>[email protected]</commiter_email>
<committer_date>Fri Apr 22 08:32:04 2011 -0700</committer_date>
<subject>chmod the output scripts</subject>
<message>
<line>Change-Id: Iae22c67066ba4160071aa2b30a5a1052b00a9d7f</line>
</message>
<target>
<line>generate-blob-scripts.sh</line>
</target>
</change>
我不认为在将它传递给XML :: Twig之前用正则表达式预处理XML是个好主意。它使你的代码不够健壮。例如,如果在评论中有'',该怎么办?另外,XML解析不太可能会减慢脚本的速度。你能提供更多的信息:文件的大小和你正在做什么样的处理? – dan1111
我目前没有在任何地方使用正则表达式。一种方法是使用树枝,另一种方法是自己读取并解析它。我从整个脚本中提取了这部分内容,因此它是唯一运行的内容。 此外,文件大小为2.3GB。我从XML中提取数据并将其中的一些添加到哈希。 – user1897691
对不起,说“正则表达式”是一个错误。我的意思是,如果在解析文件之前使用某些规则(如行分隔符)拆分文件,则可能会破坏XML的完整性。你的XML文件有多大? – dan1111