ralibm has asked for the wisdom of the Perl Monks concerning the following question:

I'm having problems retieving data out of a tree created by XML::Simple::XMLin();

After passing the the data to XMLin() and then using Data::Dumper($tree) I get something like the following:
$VAR1 = { 'Stuff1' => 'Data Stuff', 'ImportantStuff' => { 'MoreStuff' => { ... }, 'VeryImportantStuff' => { 'Item1' => { 'Description' => 'Need To Know', 'Date' => '20040101', }, 'Item2' => { ... }, 'Item3' => { ... }, }, }, };
What I want is the description of Item1. So I have something like this to capture the data.
#pseudo code struct SubFields => { Description => '$', Date => '$', }; my $s = XML::Simple->new; my $tree = $s->XMLin($someFile); my $subfields = SubFields->new(); $subfields->Description ( $tree->{ImportantStuff}->{VeryImportantStuff +}->{Item1}->{Description} ); print Dumper($subfields); print Dumper($tree);
Then I get the following output:
$VAR1 = bless({ 'SubFields::Description' => undef, 'SubFields::Date' => undef, }, 'SubFields'); $VAR1 = { 'ImportantStuff' => { 'VeryImportantStuff' => { 'Item1' => {} } }, }, 'Stuff1' => 'Data Stuff', 'ImportantStuff' => { 'MoreStuff' => { ... }, 'VeryImportantStuff' => { 'Item1' => { 'Description' => 'Need To Know', 'Date' => '20040101', }, 'Item2' => { ... }, 'Item3' => { ... }, }, }, };
As you can see the data was not retrieved, and the tree now has a new empty entry.

Why can't I get the description and why is the tree being modified?

Replies are listed 'Best First'.
Re: XML::Simple Hashes of Ref's of Hashs of Ref's...
by PodMaster (Abbot) on Mar 19, 2004 at 21:16 UTC
    As you can see the data was not retrieved, and the tree now has a new empty entry. Why can't I get the description and why is the tree being modified?
    Because your pseudocode modified you tree. Compare to this
    sub funky { #pseudocode } my $var = [ 1, 2, [ 3, 4] ]; use Data::Dumper; warn Dumper($var); funky($var); warn Dumper($var); __END__ $VAR1 = [ 1, 2, [ 3, 4 ] ]; $VAR1 = [ 1, 2, [ ] ];
    See how that happens? Maybe you wanna Clone your tree or just the part that's being modified before handing it to that pseudocode.

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

      No, sorry I don't see how it happens.

      Shouldn't the following return a scalar, or string of char for the ref 'Description'?
      $tree->{}->{}->{}->{Description}
        Consider
        use strict; use warnings; my $tree = { 'Stuff1' => 'Data Stuff', 'ImportantStuff' => { 'MoreStuff' => { }, 'VeryImportantStuff' => { 'Item1' => { 'Description' => 'Need To Know', 'Date' => '20040101', }, 'Item2' => { }, 'Item3' => { }, }, }, }; warn $tree->{ImportantStuff}{VeryImportantStuff}{Item1}{Description},$ +/; die $tree->{ImportantStuff}->{VeryImportantStuff}->{Item1}->{Descripti +on},$/; __END__ Need To Know Need To Know
        If $tree is getting modified, it's not in the code you've shown. If the "data was not retrieved" maybe it isn't there (whatever your problem is, it's in your code, not what you've chosen to show here).

        MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
        I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
        ** The third rule of perl club is a statement of fact: pod is sexy.