>>>>> On Wed, 14 Jul 2010 11:40:35 -0700, Dylan Beaudette 
>>>>> <debeaude...@ucdavis.edu> said:

DB> I would like to generalize some sample XSLT documents to convert the
DB> entire file into a sequence of CSV files.

Remember, that whatever you do in another language you can do in perl
with less code and more obfuscation:

  use XML::Simple;
  use IO::File;
  use strict;

  my $doc = XMLin($ARGV[0], SuppressEmpty => '', KeyAttr => 'foobarbogus');
  my %iohandles;

  $doc = $doc->{'pedon'};

  foreach my $key (keys(%$doc)) {
      if (!exists($iohandles{$key})) {
        die "I'm being hacked" if ($key !~ /^[_a-zA-Z0-9]/);
        $iohandles{$key} = new IO::File;
        $iohandles{$key}->open(">$key.csv");
        print STDERR "writing out $key.csv\n";
      }
      if (ref($doc->{$key}) ne 'HASH') {
        next;
      }
      foreach my $subkey (keys(%{$doc->{$key}})) {
        if (ref($doc->{$key}{$subkey}) ne 'ARRAY') {
            if (ref($doc->{$key}{$subkey}) ne 'HASH') {
                print STDERR "{$key}{$subkey} unexpected type\n";
                last;
            }
            $doc->{$key}{$subkey} = [$doc->{$key}{$subkey}];
        }
        foreach my $record (@{$doc->{$key}{$subkey}}) {
            $iohandles{$key}->print(join(",",values(%$record)),"\n");
        }
      }
  }

# perl hack.pl pedons.xml
writing out hz_mottles.csv
writing out hz_frags.csv
writing out horizon.csv
writing out hz_roots.csv
writing out memo.csv
writing out description.csv
{description}{surface_frags_bd} unexpected type
writing out hz_pores.csv
writing out hz_pvsf.csv
writing out notes.csv
writing out hz_rmf.csv
writing out diagnostic.csv
writing out vegetation.csv
writing out pedon_spatial.csv
{pedon_spatial}{y} unexpected type

-- 
Wes Hardaker                                     
My Pictures:  http://capturedonearth.com/
My Thoughts:  http://pontifications.hardakers.net/
_______________________________________________
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech

Reply via email to