From 24eac8245663b498b4eabf6c2a531f88d27b3864 Mon Sep 17 00:00:00 2001 From: Fridolyn SOMERS Date: Thu, 17 Jan 2013 11:42:53 +0100 Subject: [PATCH] Bug 9415: XML catalog export is missing root node When exporting some biblio or authorities records with tools/export.pl (via web client or command-line) : If choosing XML format, you get a concatenation of full XML records. This patch uses MARC::File::XML to create a well formated file. See http://search.cpan.org/~gmcharlt/MARC-XML-0.93/lib/MARC/File/XML.pm#close%28%29 Test plan: - Go to Tools/Export data - Enter numbers in from and to biblio number (make sure that at least two records will be exported). - Select xml in file format - Click "Export bibliographic records" - Save file somewhere - Look at downloaded file => File should look like : ... ... => "collection" is the root node and XML declaration exists only once - Do the same for authorities export and command-line use of tools/export.pl Second test plan: - From the command line, run tools/export.pl, e.g., tools/export.pl --format=xml --filename=bibs.xml - Verify that the output is valid XML, e.g., xmllint --noout bibs.xml # if the file is valid, no error messages will be displayed Signed-off-by: Galen Charlton Signed-off-by: Paul Poulain Signed-off-by: Jared Camins-Esakov --- tools/export.pl | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tools/export.pl b/tools/export.pl index 1b5a766513..d634419106 100755 --- a/tools/export.pl +++ b/tools/export.pl @@ -17,6 +17,7 @@ # Suite 330, Boston, MA 02111-1307 USA use Modern::Perl; +use MARC::File::XML; use List::MoreUtils qw(uniq); use Getopt::Long; use CGI; @@ -309,6 +310,7 @@ if ( $op eq "export" ) { } @{ $sth->fetchall_arrayref }; } + my $xml_header_written = 0; for my $recordid ( uniq @recordids ) { if ($deleted_barcodes) { my $q = " @@ -374,19 +376,30 @@ if ( $op eq "export" ) { } RemoveAllNsb($record) if ($clean); if ( $output_format eq "xml" ) { - if ( $marcflavour eq 'UNIMARC' && $record_type eq 'auths' ) - { - print $record->as_xml_record('UNIMARCAUTH'); - } - else { - print $record->as_xml_record($marcflavour); + unless ($xml_header_written) { + MARC::File::XML->default_record_format( + ( + $marcflavour eq 'UNIMARC' + && $record_type eq 'auths' + ) ? 'UNIMARCAUTH' : $marcflavour + ); + print MARC::File::XML::header(); + print "\n"; + $xml_header_written = 1; } + print MARC::File::XML::record($record); + print "\n"; } else { print $record->as_usmarc(); } } } + if ($xml_header_written) { + print MARC::File::XML::footer(); + print "\n"; + } + exit; } elsif ( $format eq "csv" ) { -- 2.39.5