X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy%2FRecord.pm;h=8a09c541cdad02919a526bf5035ab30acd19f3ca;hp=bded029f83abf8f50c06949d7500d2833ffa1657;hb=c8c1a66291479405710e0020a59389cccf31d3e8;hpb=f4ad227f469be5cf0d848e1e7e99f7620abcf4a9 diff --git a/lib/ZOOM/IRSpy/Record.pm b/lib/ZOOM/IRSpy/Record.pm index bded029..8a09c54 100644 --- a/lib/ZOOM/IRSpy/Record.pm +++ b/lib/ZOOM/IRSpy/Record.pm @@ -1,4 +1,4 @@ -# $Id: Record.pm,v 1.2 2006-06-20 12:36:14 mike Exp $ +# $Id: Record.pm,v 1.6 2006-07-21 16:50:20 mike Exp $ package ZOOM::IRSpy::Record; @@ -6,17 +6,21 @@ use 5.008; use strict; use warnings; +use XML::LibXML; +use XML::LibXML::XPathContext; + + =head1 NAME ZOOM::IRSpy::Record - record describing a target for IRSpy =head1 SYNOPSIS - ### To follow + ## To follow =head1 DESCRIPTION -I<### To follow> +I<## To follow> =cut @@ -24,14 +28,60 @@ sub new { my $class = shift(); my($target, $zeerex) = @_; - ### Should compile the ZeeRex record into something useful. + if (!defined $zeerex) { + $zeerex = _empty_zeerex_record($target); + } + + my $parser = new XML::LibXML(); return bless { target => $target, - zeerex => $zeerex, + zeerex => $parser->parse_string($zeerex)->documentElement(), }, $class; } +sub _empty_zeerex_record { + my($target) = @_; + + ### Doesn't recognise SRU/SRW URLs + my($host, $port, $db) = ZOOM::IRSpy::_parse_target_string($target); + + return <<__EOT__; + + + $host + $port + $db + + +__EOT__ +} + + +sub append_entry { + my $this = shift(); + my($xpath, $frag) = @_; + + print STDERR "this=$this, xpath='$xpath', frag='$frag'\n"; + my $root = $this->{zeerex}; # XML::LibXML::Element ISA XML::LibXML::Node + print "Record='", $root->toString(), "'\n"; + my $xc = XML::LibXML::XPathContext->new($root); + $xc->registerNs(zeerex => "http://explain.z3950.org/dtd/2.0/"); + $xc->registerNs(irspy => "http://indexdata.com/irspy/1.0"); + + my @nodes = $xc->findnodes($xpath); + if (@nodes == 0) { + ZOOM::Log::log("irspy", "no matches for '$xpath': can't append"); + return; + } elsif (@nodes > 1) { + ZOOM::Log::log("irspy", scalar(@nodes), + " matches for '$xpath': using first"); + } + + print STDERR "zeerex='$root'\n"; +} + + =head1 SEE ALSO ZOOM::IRSpy