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

Hi Monks,

I have an XML::Simple question. I'm trying to format a data structure into an XML node that will be understood by my companies legacy apps.

Making changes to the underlying data structure will mean big changes, so am investigating all possible XMLOut() options first. The data structure is:

'user' => { 'favorites' => [ { 'title' => 'Book1','genre' => '5','author' => 'Someone' }, { 'title' => 'Book2','genre' => '1','author' => 'Someone' } ] }

XMLout() formats this to:

<user> <favorites> <title>Book1</title> <genre>5</genre> <author>Someone</author> </favorites> <favorites> <title>Book2</title> <genre>1</genre> <author>Someone</author> </favorites> </user>

Is it possible to use any of XMLout's options to get the desired format below?

<user> <favorites> <item> <title>Book1</title> <genre>5</genre> <author>Someone</author> </item> <item> <title>Book2</title> <genre>1</genre> <author>Someone</author> </item> </favorites> </user>

My current XML::Simple options are;

use XML::Simple qw(:strict); #must use strict my $xs = new XML::Simple; my $xml = $xs->XMLout($req,NoAttr => 1,RootName=>'user',KeyAttr=>[]);

Any help greatly appreciated.

Replies are listed 'Best First'.
Re: XML::Simple, XMLOut() question
by samarzone (Pilgrim) on Dec 15, 2010 at 14:29 UTC

    On the first sight it seems that you will have to change your structure to following -

    'user' => { 'favorites' => { 'item' => [ { 'title' => 'Book1','genre' => '5','author' => 'Someone' }, { 'title' => 'Book2','genre' => '1','author' => 'Someone' } ] } }
    -- Regards - Samar
      Thinking along the same lines. Means looping through the anon array of hashes returned by the query to extract a users favorites and adding the parent key 'item' to each, could work though will give it a try.

        You need not loop. Following would suffice

        $x->{user}->{favorites} = {item => $x->{user}->{favorites}};

        where $x is your original structure


        -- Regards - Samar