Perl XML解析器和Expat

问题描述:

我有一个巨大的XML文件加载数据,我需要创建一个perl脚本,它将解析XML并只提取所需的数据。Perl XML解析器和Expat

我被告知使用expat,我想知道如果任何人有任何好的tutroial或关于如何使用perl和expat来解析XML的文章。

希望这对于perl来说真的很新颖。

+0

您也可以考虑看的Perl模块'XML :: Simple'。我已经使用了它,并发现它对大多数XML项目非常有效。这也相当直观,易于拿起并立即开始使用。 – David

+0

@David:XML :: Simple对于“巨大”文件并不理想。 – runrig

通过一些包装如XML-TwigXML-Rules间接使用expat可能会更容易。但是也可以使用来自XML-LibXML(其使用libxml而不是expat)的拉动解析器(例如XML :: LibXML :: Reader)进行解析。

如果真如你所说,XML文件是巨大的,并且只需要一些选定的数据,那么XML ::阅读:RS应该做的工作:它使用XML解析器::作为底层解析模块,这又使用expat来解析XML。

以下代码片段仅解析从潜在巨大的XML文件中需要的信息。它只使用的内存量小:

use strict; 
use warnings; 

use XML::Reader::RS; 

my $rdr = XML::Reader::RS->new(\*DATA, { mode => 'branches' }, 
    { root => '/info/line[@cat="A"]', branch => [ '/' ] }); 

while ($rdr->iterate) { 
    my ($line) = $rdr->value; 

    for ($line) { 
     $_ = '' unless defined $_; 
    } 

    print "line = '$line'\n"; 
} 

__DATA__ 
<info> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="A">Data 0000001</line> 
    <line cat="A">Data 0000002</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
    <line cat="xyz">abc</line> 
</info> 

(但是,XML ::阅读:: RS是不是最快的,如果你想速度以及存储效率,那么你应该考虑使用XML解析器::直接)