
brucem at dynamicrange
Apr 3, 2009, 11:27 AM
Post #1 of 2
(959 views)
Permalink
|
|
Proposed patch for XML::Simple ser/deser
|
|
(I filed a ticket about this, but enhanced the solution since then) Subject to Hans' comments about big picture moving of Ser/Deser stuff out, I need(ed) some small extensions to the XML de/serializer to make it general-purpose. Specifically, I needed control over the conversion options for each direction, and I need(ed) to have the output data *not* wrapped in <data>. So I put together these mods which extend the capabilities while maintaining the existing defaults. Please let me know if they're useful, and if there is anything else that I can do. I can add some tests and doc if that would help. Cheers, Bruce diff -rc /Library/Perl/5.8.8/Catalyst/Action/Deserialize/XML/Simple.pm Catalyst/Action/Deserialize/XML/Simple.pm *** /Library/Perl/5.8.8/Catalyst/Action/Deserialize/XML/Simple.pm 2009-04-03 11:08:17.000000000 -0700 --- Catalyst/Action/Deserialize/XML/Simple.pm 2009-04-02 08:08:42.000000000 -0700 *************** *** 27,33 **** my $body = $c->request->body; if ($body) { ! my $xs = XML::Simple->new('ForceArray' => 0,); my $rdata; eval { $rdata = $xs->XMLin( "$body" ); --- 27,42 ---- my $body = $c->request->body; if ($body) { ! my $deserialize_options_ref; ! if (exists($controller->{'deserialize_options'})) ! { ! $deserialize_options_ref = $controller- >{'deserialize_options'}; ! } ! else ! { ! $deserialize_options_ref = [ 'ForceArray' => 0 ]; ! } ! my $xs = XML::Simple->new(@$deserialize_options_ref); my $rdata; eval { $rdata = $xs->XMLin( "$body" ); diff -rc /Library/Perl/5.8.8/Catalyst/Action/Serialize/XML/Simple.pm Catalyst/Action/Serialize/XML/Simple.pm *** /Library/Perl/5.8.8/Catalyst/Action/Serialize/XML/Simple.pm 2009-04-03 11:08:03.000000000 -0700 --- Catalyst/Action/Serialize/XML/Simple.pm 2009-04-02 08:23:01.000000000 -0700 *************** *** 24,39 **** if $c->debug; return 0; } ! my $xs = XML::Simple->new(ForceArray => 0,); my $stash_key = ( $controller->{'serialize'} ? $controller->{'serialize'}->{'stash_key'} : $controller->{'stash_key'} ) || 'rest'; my $output; eval { ! $output = $xs->XMLout({ data => $c->stash->{$stash_key} }); }; if ($@) { return $@; --- 24,56 ---- if $c->debug; return 0; } ! my $serialize_options_ref; ! if (exists($controller->{'serialize_options'})) ! { ! $serialize_options_ref = $controller->{'serialize_options'}; ! } ! else ! { ! $serialize_options_ref = [ 'ForceArray' => 0 ]; ! } ! my $xs = XML::Simple->new(@$serialize_options_ref); my $stash_key = ( $controller->{'serialize'} ? $controller->{'serialize'}->{'stash_key'} : $controller->{'stash_key'} ) || 'rest'; + + # Assumption: if the user chooses to monkey with serialization options, + # they are controlling the output structure precisely. If that's true, + # don't force-wrap the output in "<data>" tags. + my $output_ref = exists($controller->{'serialize_options'}) ? + $c->stash->{$stash_key} : + { data => $c->stash->{$stash_key} }; + my $output; eval { ! $output = $xs->XMLout( $output_ref ); }; if ($@) { return $@; --- Bruce McKenzie brucem [at] dynamicrange
|