读取非常大的xml文件并提取节点

时间:2013-12-30 21:42:13

标签: xml perl

我正在处理一个非常大的xml文件(超过15 G),我认为我的代码可以改进。 这是代码:

use strict; 
use warnings;
use XML::LibXML::Reader;

my $fname=$ARGV[0] ||  die 'input xml is required';
my $xsd1 = $ARGV[1] || die 'input xsd is required';

my $reader = XML::LibXML::Reader->new(location => "$fname",Schema => "$xsd1" )
     or die "cannot read $fname\n";
while ($reader->read) {
   if ( $reader->localName eq 'company' ) {
      print $reader->readInnerXml;
   };

}

在$读取器之后发出通知> readInnerXml文件指针在公司和while循环读取文件两次后仍然指向下一个节点。

无论如何指向$ reader-> readInnerXml之后的下一个'company'节点并删除while循环?

感谢 迈克尔

1 个答案:

答案 0 :(得分:1)

如果您需要的节点位于同一级别,则可以尝试以下操作:

my $pattern = XML::LibXML::Pattern->new('/*/company');
$reader->nextPatternMatch($pattern)
  or die "E: pattern not found.\n";

do {
    print $reader->readOuterXml();
} while ( $reader->nextSiblingElement() );