Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

XML tree to HASH

by bugsbunny (Scribe)
on Aug 15, 2003 at 14:35 UTC ( [id://284168]=perlquestion: print w/replies, xml ) Need Help??

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

hi,
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?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2024-04-19 17:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found