From 1acd721b9e91e87462bba859c2449bccf30680d2 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 - 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 --- tools/export.pl | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/tools/export.pl b/tools/export.pl index 0415a3a..3a7a20b 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" ) { @@ -468,7 +481,7 @@ else { itemtypeloop => \@itemtypesloop, DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), authtypeloop => \@authtypesloop, - export_remove_fields => C4::Context->preference("ExportRemoveFields"), + export_remove_fields => C4::Context->preference("ExportRemoveFields"), ); output_html_with_http_headers $query, $cookie, $template->output; -- 1.7.9.5