PICA::SRUSearchParser - Parse a SRU response in XML and extract PICA+ records.


PICA-Record documentation Contained in the PICA-Record distribution.

Index


Code Index:

NAME

Top

PICA::SRUSearchParser - Parse a SRU response in XML and extract PICA+ records.

SYNOPSIS

Top

    $parser = PICA::SRUSearchParser->new();
    $xmlparser = $parser->parse( $sru );

    print "numberOfRecords: " . $parser->numberOfRecords . "\n";
    print "resultSetId: " . $parser->resultSetId . "\n";
    print "result: " . $xmlparser->counter() . "\n";

METHODS

Top

new ( [ $xmlparser ] )

Creates a new XML parser to parse an SRU Search Response document. PICA Records are passed to a PICA::XMLParser that must be provided.

parse( $document )

Parse an SRU SearchRetrieve Response (given as XML document) and return the PICA::XMLParser object that has been used.

numberOfRecords ()

Get the total number of records in the SRU result set. The result set may be split into several chunks.

currentNumber ()

Get the current number of records that has been passed. This is equal to or less then numberOfRecords.

resultSetId ()

Get the SRU resultSetId that has been parsed.

PRIVATE HANDLERS

Top

This methods are private SAX handlers to parse the XML.

StartTag

SAX handler for XML start tag. On PICA+ records this calls the start handler of PICA::XMLParser, outside of records it parses the SRU response.

EndTag

SAX handler for XML end tag. On PICA+ records this calls the end handler of PICA::XMLParser.

Text

SAX handler for XML character data. On PICA+ records this calls the character data handler of PICA::XMLParser.

AUTHOR

Top

Jakob Voss <jakob.voss@gbv.de>

LICENSE

Top

Copyright (C) 2007-2009 by Verbundzentrale Goettingen (VZG) and Jakob Voss

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.


PICA-Record documentation Contained in the PICA-Record distribution.
package PICA::SRUSearchParser;

use strict;

our $VERSION = "0.48";

use Carp qw(croak);
use PICA::XMLParser;
use XML::Parser;

sub new {
    my ($class, $xmlparser) = @_;
    $class = ref $class || $class;

    $xmlparser = PICA::XMLParser->new()
        unless UNIVERSAL::isa($xmlparser, "PICA::XMLParser");

    my $self = {
        xmlparser => $xmlparser,
        char_data => "",
        in_record => 0,
        numberOfRecords => undef,
        currentNumber => 0,
        resultSetId => undef,
    };

    return bless $self, $class;
}

sub parse {
    my ($self, $document) = @_;
    my $sruparser = XML::Parser->new(
       Handlers => {    # TODO: memory leak (?)
          Start => sub {$self->StartTag(@_)},
          End   => sub {$self->EndTag(@_)},
          Char  => sub {$self->Text(@_)}
#         # TODO: Init and Final are never called. Do we need them?
       }
    );
    $self->{currentNumber} = 0;
    $sruparser->parse($document);
    return $self->{xmlparser};
}

sub numberOfRecords {
    my $self = shift;
    return $self->{numberOfRecords};
}

sub currentNumber {
    my $self = shift;
    return $self->{currentNumber};
}

sub resultSetId {
    my $self = shift;
    return $self->{resultSetId};
}

sub StartTag {
    my ($self, $parser, $name, %attrs) = @_;
    if ($self->{in_record}) {
        $self->{xmlparser}->start_handler($parser, $name, %attrs);
    } else {
        $self->{char_data} = "";
        if ($name eq "srw:recordData") {
            $self->{in_record} = 1;
        }
    }
}

sub EndTag {
    my ($self, $parser, $name) = @_;

    if ($self->{in_record}) {
        if ($name eq "srw:recordData") {
            $self->{currentNumber}++;
            $self->{in_record} = 0;
        } else {
            $self->{xmlparser}->end_handler($parser, $name);
        }
    } else {
        if ($name eq "srw:numberOfRecords") {
            $self->{numberOfRecords} = $self->{char_data};
        } elsif ($name eq "srw:resultSetId") {
            $self->{resultSetId} = $self->{char_data};
        }
    }
}

sub Text {
    my ($self, $parser, $string) = @_;

    if ($self->{in_record}) {
        $self->{xmlparser}->char_handler($parser, $string);
    } else {
        $self->{char_data} .= $string;
    }
}

1;