Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

XML tree to HASH

by bugsbunny (Scribe)
on Aug 15, 2003 at 14:35 UTC ( #284168=perlquestion: print w/replies, xml ) Need Help??
bugsbunny has asked for the wisdom of the Perl Monks concerning the following question:

I'm twig'ing a XML file (with XML::Twig via callback function).In the element handler I can extract parent-tag-id.
My question is how to build a HASH so that with only one check I can see if some element is a child to a specfic parent..
I thought of something in the lines of :
$hash{element} =~ /$parentID/
What I thought, is a string with ID's of all parents (for the element), the problem then is that this can be time&memory consuming to buid it..
I mean if it is more time&memory consuming to build such a structure, then it is better not to do it, but instead walk the tree from element-to->top-parent to see if it is a child, at the moment I'm doing the comparison..
I'm talking for gnuCash xml-file gnc:account tags handler.
in most of the cases account hierarcy dont go more than 3-4 level deep..

Replies are listed 'Best First'.
Re: XML tree to HASH
by mirod (Canon) on Aug 15, 2003 at 15:50 UTC

    The easiest way is to do $elt->in( $parent). If you only have the ID of the parent, as it happens, those are stored and you can use $twig->elt_id( $parent_id) to get the element itself.

    elt_id is fast, it is just a hash look-up, but in has to walk the ancestors of the element. I would be surprised if this was a real bottleneck in an application though.Does it really cause you performance problems? In that case it would help if you could show us a bit of code (and the associated data).

Re: XML tree to HASH
by eric256 (Parson) on Aug 15, 2003 at 15:06 UTC

    You could store the info $hash{$element}{$parentID} = 1;

    Then if ($hash{$element}{$parentID}) would tell you if it was a parent or not. I'm not sure if its any better than sticking them all in a string and regexing it. If you do regex make sure to delimit each id so that checking for 2 doesn't match the 2 in 20.

    Eric Hodges

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://284168]
Front-paged by broquaint
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (4)
As of 2016-10-27 04:18 GMT
Find Nodes?
    Voting Booth?
    How many different varieties (color, size, etc) of socks do you have in your sock drawer?

    Results (353 votes). Check out past polls.