The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package MARC::File::SAX;

## no POD here since you don't really want to use this module
## directly. Look at MARC::File::XML instead.
##
## MARC::File::SAX is a SAX handler for parsing XML encoded using the 
## MARC21slim XML schema from the Library of Congress. It builds a MARC::Record
## object up from SAX events.
##
## For more details see: http://www.loc.gov/standards/marcxml/

use strict;
use XML::SAX;
use base qw( XML::SAX::Base );
use Data::Dumper;
use MARC::Charset qw(utf8_to_marc8);

sub start_element {
    my ( $self, $element ) = @_;
    my $name = $element->{ Name };
    if ( $name eq 'leader' ) { 
	$self->{ tag } = 'LDR';
    } elsif ( $name eq 'controlfield' ) {
	$self->{ tag } = $element->{ Attributes }{ '{}tag' }{ Value };
    } elsif ( $name eq 'datafield' ) { 
	$self->{ tag } = $element->{ Attributes }{ '{}tag' }{ Value };
	$self->{ i1 } = $element->{ Attributes }{ '{}ind1' }{ Value };
	$self->{ i2 } = $element->{ Attributes }{ '{}ind2' }{ Value };
    } elsif ( $name eq 'subfield' ) { 
	$self->{ subcode } = $element->{ Attributes }{ '{}code' }{ Value };
    }
}

sub end_element { 
    my ( $self, $element ) = @_;
    my $name = $element->{ Name };
    if ( $name eq 'subfield' ) { 
	push @{ $self->{ subfields } }, $self->{ subcode };
	
	if ($self->{ transcode }) {
           push @{ $self->{ subfields } }, utf8_to_marc8($self->{ chars });
	} else {
           push @{ $self->{ subfields } }, $self->{ chars } ;
	}

	$self->{ chars } = '';
	$self->{ subcode } = '';
    } elsif ( $name eq 'controlfield' ) { 
	$self->{ record }->append_fields(
	    MARC::Field->new( $self->{ tag }, $self->{ chars } )
	);
	$self->{ chars } = '';
	$self->{ tag } = '';
    } elsif ( $name eq 'datafield' ) { 
	$self->{ record }->append_fields( 
	    MARC::Field->new( 
		$self->{ tag }, 
		$self->{ i1 }, 
		$self->{ i2 },
		@{ $self->{ subfields } }
	    )
	);
	$self->{ tag } = '';
	$self->{ i1 } = '';
	$self->{ i2 } = '';
	$self->{ subfields } = [];
	$self->{ chars } = '';
    } elsif ( $name eq 'leader' ) { 
	my $ldr = $self->{ chars };
	$self->{ transcode }++
		if (substr($ldr,9,1) eq 'a' and $self->{toMARC8});
	
	substr($ldr,9,1,' ') if ($self->{ transcode });
	$self->{ record }->leader( $ldr );
	$self->{ chars } = '';
	$self->{ tag } = '';
    }

}

sub characters {
    my ( $self, $chars ) = @_;
    if ( $self->{ subcode } or ( $self->{ tag } and 
	( $self->{ tag } eq 'LDR' or $self->{ tag } < 10 ) ) ) { 
	$self->{ chars } .= $chars->{ Data };
    } 
}

1;