http://www.perlmonks.org?node_id=1016318


in reply to Re: XML Parsing
in thread XML Parsing

First of all thank you Harish. I got the output as suggested. Say for example I had few more child elements under value tag, can I use foreach and extract the elements/sub-elements into a hash/array? Could you give me any sample code to put the contents of $hash_when_cat_eq_special in an hash? Thanks.

Replies are listed 'Best First'.
Re^3: XML Parsing
by tmharish (Friar) on Jan 31, 2013 at 14:12 UTC

    Quite simply $hash_when_cat_eq_special is a pointer to a hash. So you can do your normal hash operations on it. The ->pointer() function returns this for you.

    In terms of the foreach:

    foreach my $elem ( @{ $xml_obj->{list}{value} } ) { $hash_of_subtree = $elem->pointer() ; }

    The advantage here is that $xml_obj, $xml_obj->{list} ... are all Objects of type XML::Smart and can always be used as either a hash OR an array.

    To extract your data you can simply use the 'pointer' function ( $xml_smart_obj->pointer() )that will return the hash structure or the 'content' function ( $xml_smart_obj->content() ) that will return the contents of a node.

      Harish, I see that when using content() to return contents of the node and that $xml_smart_obj was always returning one element, whereas the xml has multiple entries for the tag <parameter>. 1. How to list down all the pointers/contents for the tag <parameter> 2. Can I see the array size using $#xml_obj ? Thanks

        ->pointer will actually give you the tree starting from where you have traversed to in the xml_smart object. It will be a hash which you can use like an ordinary hash.

        You can traverse the object using the method described above and it will move the pointer.

        ___________node1 | root ---|-----------node2 |___________node3 ^ |________________Pointer could be here.

        Now when you ask for ->content() it will give you the content at node3 and if you ask for ->pointer it will give you the sub-tree starting from node3 in a hash.

        Hope that helps - Let me know if you need further clarification.