#!/usr/pkg/bin/perl

#
# xml_to_db.pm
# Copyright (C) 2011-2018 by John Heidemann <johnh@isi.edu>
#
# This program is distributed under terms of the GNU general
# public license, version 2.  See the file COPYING
# in $dblib for details.
#


=head1 NAME

xml_to_db - convert a subset of XML into fsdb

=head1 SYNOPSIS

    xml_to_db -k EntityField <source.xml

=head1 DESCRIPTION

Converts a I<very limited> subset of XML into Fsdb format.

The input is XML-format (I<not> fsdb).
The input is parsed as XML, and each entity
of type ENTITYFIELD is extracted as a row.
ENTITYFIELD can have mutliple components separated by slashes
to walk down the XML tree, if necessary.

The input XML file is assumed to be I<very simple>.
All rows are assumed to be sequential in one entity.
Any other than the specified ENTITYFIELD are ignored.
The schema is assumed to be defined by the first instances of that field.

The output is two-space-separated fsdb.
(Someday more general field separators should be supported.)
Fsdb fields are normalized version of the CSV file:
spaces are converted to single underscores.

=head1 OPTIONS

=over 4

=item B<-e> EmptyValue or B<--empty>

Specify the value newly created columns get.

=back

=for comment
begin_standard_fsdb_options

This module also supports the standard fsdb options:

=over 4

=item B<-d>

Enable debugging output.

=item B<-i> or B<--input> InputSource

Read from InputSource, typically a file name, or C<-> for standard input,
or (if in Perl) a IO::Handle, Fsdb::IO or Fsdb::BoundedQueue objects.

=item B<-o> or B<--output> OutputDestination

Write to OutputDestination, typically a file name, or C<-> for standard output,
or (if in Perl) a IO::Handle, Fsdb::IO or Fsdb::BoundedQueue objects.

=item B<--autorun> or B<--noautorun>

By default, programs process automatically,
but Fsdb::Filter objects in Perl do not run until you invoke
the run() method.
The C<--(no)autorun> option controls that behavior within Perl.

=item B<--help>

Show help.

=item B<--man>

Show full manual.

=back

=for comment
end_standard_fsdb_options


=head1 SAMPLE USAGE

=head2 Input:

	<?xml version='1.0' standalone='yes'?>
	<gnuPod>
	 <files>
	  <file addtime="3389919728" album="Born to Pick" artist="7th Day Buskers" title="Loch Lamor" />
	  <file addtime="3389919728" album="Born to Pick" artist="7th Day Buskers" title="The Floods" />
	  <file addtime="3389919735" album="Copland Conducts Copland" artist="Aaron Copland" title="Our Town" />
	 </files>
	 <playlist name="new shows" plid="97241" >
	   <regex artist="^(Le Show|This American Life)$" />
	 </playlist>
	</gnuPod>

=head2 Command:

        xml_to_db -k files/file <gnupod.xml

=head2 Output:

	#fsdb -F S addtime album artist title
	3389919728  Born to Pick  7th Day Buskers  Loch Lamor
	3389919728  Born to Pick  7th Day Buskers  The Floods
	3389919735  Copland Conducts Copland  Aaron Copland  Our Town
	#   | xml_to_db -k files/file

=head1 SEE ALSO

L<Fsdb>.


=cut


# WARNING: This code is derived from xml_to_db.pm; that is the master copy.

use Fsdb::Filter::xml_to_db;
my $f = new Fsdb::Filter::xml_to_db(@ARGV);
$f->setup_run_finish;  # or could just --autorun
exit 0;


=head1 AUTHOR and COPYRIGHT

Copyright (C) 2011-2018 by John Heidemann <johnh@isi.edu>

This program is distributed under terms of the GNU general
public license, version 2.  See the file COPYING
with the distribution for details.

=cut

1;
