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


in reply to Re: XML::Simple parsing help
in thread XML::Simple parsing help

Thank you. Dereferencing this made me dizzy.

Replies are listed 'Best First'.
Re^3: XML::Simple parsing help
by Kenosis (Priest) on Dec 09, 2012 at 22:56 UTC

    You're most welcome!

    Your question has sparked many great solutions. Here's one option that uses Mojo::DOM to parse the XML.

    The parsing's in a subroutine, so you just send a dom object and the number, and a hash is returned with the requested data--if found:

    use Modern::Perl; use Mojo::DOM; use Data::Dumper; my $xml = <<'END'; <inventors type="array"> <inventor> <city>Aston Clinton</city> <name>Andy Barth</name> <number type="integer">1</number> <country>GB</country> <upper-name>ANDY BARTH</upper-name> </inventor> <inventor> <city>Aylesbury</city> <name>Daniele Dall'Acqua</name> <number type="integer">2</number> <country>GB</country> <upper-name>DANIELE DALL'ACQUA</upper-name> </inventor> <inventor> <city>Calne</city> <name>Nigel Drew</name> <number type="integer">3</number> <country>GB</country> <upper-name>NIGEL DREW</upper-name> </inventor> </inventors> END my $dom = Mojo::DOM->new($xml); my %record = getInventorNum($dom, 1); print Dumper \%record; sub getInventorNum { my ( $dom, $num ) = @_; my %hash; $dom->find('number')->each( sub { if ( $_->text == $num ) { for my $element ( @{ $_->parent->children } ) { next if $element->type eq 'number'; $hash{ $element->type } = $element->text; } } } ); return %hash; }

    Dumper output of %record:

    $VAR1 = { 'country' => 'GB', 'city' => 'Aston Clinton', 'upper-name' => 'ANDY BARTH', 'name' => 'Andy Barth' };