#!/usr/bin/perl use warnings; use strict; use XML::Simple; use MARC::File::XML; use Time::HiRes qw(gettimeofday); # Number of time the following record is parsed my $max = 1000; # Tested SAX parsers my @xml_parsers = qw( XML::SAX::PurePerl XML::LibXML::SAX::Parser XML::SAX::Expat XML::SAX::ExpatXS ); my $raw_xml = < 00675cam a22002051 4500 10026159 DLC 20050815184409.0 830916s1910 gw 000 0 ger 10026159 (OCoLC)9914473 DLC OCU OCU DLC premarc PA6792.Z9 G4 Germann, Peter. Die sogenannten Sententiae Varronis. Von Peter Germann. Paderborn, F. Scho��ningh, 1910. 2 p. l., 98 p., 1 l. 24 cm. Studien zur Geschichte und Kultur des Altertums ... 3. Bd., 6. Hft Varro, Marcus Terentius. Spurious and doubtful works. Sententiae Varronis. EOS # Pure Perl parser sub get_record_from_xml { my $raw = shift; return unless $raw; return undef unless $raw =~ //, $raw; my $record = MARC::Record->new(); my @fields; while ( @parts ) { $_ = shift @parts; $_ = shift @parts if /leader($_); next; } if ( /new( $tag, $_ ); next; } if ( / $_; } push @fields, MARC::Field->new($tag, $ind1, $ind2, @subf); shift @parts; next; } last; } $record->{_fields} = \@fields; return $record; }; my $xs = XML::Simple->new(); # SAX parser sub get_record_from_xml_sax { my ($raw) = @_; return unless $raw; my $ref = eval { $xs->XMLin($raw, forcearray => [ 'subfield' ] ) }; return undef if $@; my $record = MARC::Record->new(); $record->leader( $ref->{leader} ); my @fields_control = map { MARC::Field->new( $_->{tag}, $_->{content} ); } @{$ref->{controlfield}}; my @fields_std = map { my @sf = map { ($_->{code}, $_->{content}) } @{$_->{subfield}}; MARC::Field->new( $_->{tag}, $_->{ind1}, $_->{ind2}, @sf, ); } @{$ref->{datafield}}; $record->{_fields} = [ @fields_control, @fields_std ]; } sub parse_with_perl { my $start = gettimeofday; for ( my $count = 0; $count < $max; $count++ ) { my $record = get_record_from_xml($raw_xml); } print "Parsed $max MARC::Record objects from XML in pure Perl: ", gettimeofday - $start, "\n"; } sub parse_with_sax { for my $sax_parser ( @xml_parsers ) { $XML::SAX::ParserPackage = $sax_parser; my $count = 0; my $start = gettimeofday; for ( my $count = 0; $count < $max; $count++ ) { my $record = get_record_from_xml_sax( $raw_xml ); $count++; last if $count == $max; } print "Parsed $max MARC::Record objects from XML using ", "$sax_parser : ", gettimeofday - $start, "\n"; } } parse_with_perl(); parse_with_sax();