我正在处理一个非常大的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循环?
感谢 迈克尔
答案 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() );