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