# This module produces results rather like L<XML::Simple>, but # without the ambiguity problems inherent in going from XML to # Perl.

use strict;
use warnings;
use XML::CuteQueries;

my $CQ = XML::CuteQueries->new;

$CQ->parse(<<"EOXML");

<root>

<result>OK</result>
<data>

        <row><f1> 7</f1><f2>11</f2><f3>13</f3></row>
        <row><f1>17</f1><f2>19</f2><f3>23</f3></row>
        <row><f1>29</f1><f2>31</f2><f3>37</f3></row>

</data>
</root>

EOXML

my $arrayref_of_hashrefs = $CQ->cute_query(

# the top level query is for the <data> elements # the shape of the only top level query is [], # so it returns one [] -- for the one <data> element

"data" => [

        # the contents of the top level [] is a sub query for row elements.
        # Each row element should be a hashref, so the data-[] will contain
        # three row-{} hashrefs

        row => {

            # the contents of those hashrefs is a subquery for any tag found
            # there.  The tag names are preserved as keys because we're
            # sitting in the context of a hashref.
            # the shape of each match result is '', so it just returns the
            # contents of each tag as a string.

            '*' => '',
        }

],
);

# [ {f1=> 7, f2=>11, f3=>13},
# {f1=>17, f2=>19, f3=>23},
# {f1=>29, f2=>31, f3=>37}, ]