#!/usr/bin/perl

=head1 NAME

Example of using XML::DT the import XML to complex perl structure

=head1 input

 <top_level>
   <name>test case</name>
   <junk>just some more tags</junk>
   <sub_level_1>
        <element name="attr1">
              <value format="inches">121</value>
              <modifier>add</modifier>
        </element>
        <element name="attr2">
              <value format="yards">1.5</value>
              <modifier>sub</modifier>
        </element>
   </sub_level_1>
 </top_level>

=head2 output

 {'junk' => 'just some more tags',
  'sub_level_1' => { 'attr1' => { 'value' => '121',
                                  'name' => 'attr1',
                                  'modifier' => 'add' },
                     'attr2' => { 'value' => '1.5',
                                  'name' => 'attr2',
                                  'modifier' => 'sub' }
                   },
  'name' => 'test case' }                  

=cut


use XML::DT ;
use Data::Dumper;
my $filename = shift;

%handler=(
  '-type' => { 
          top_level => 'MAP',      #    
          sub_level_1 => 'SEQ',    # of element  (1)
#         name => 'STR',           # the default 
#         junk => 'STR',           # the default
          element => 'MAP'   },    # (2)

  '-default'  => sub{$c},
  element     => sub{ $c->{name} = $v{name}; $c},           # (3)
  sub_level_1 => sub{ +{ map { ($_->{name}, $_) } @$c } },  # (4)
);
print Dumper(dt($filename,%handler));         


__END__
________notes:
(1) See also SEQH instead of SEQ

(2) beeing a MAP the attributes and the tagname are deleted => in this case 
  we can add a element processing sub  (see (3))

(3) $c is the ref to hash; "name" att is missing but it is available in %v
  In this sub we copied it
# or if you prefer:
#    element    => sub{ +{ %v, %$c}},   #add all atts in %v to $c

(4) we have a list of ref to hash and we want a hash of hash
      for all the elements in @$c
         make a pair with the name value, and the complete element

