From: Jason S. <jas...@gm...> - 2008-09-18 01:23:23
|
Hey everyone, Is there any feedback on this? I would like the output of dataof() to return a SOAP::Data object that can be serialized into the XML that it was created from - and currently it is broken. My proposed patch would fix this. Cheers, jas. On Sun, Sep 14, 2008 at 12:32 PM, Jason Stewart <jas...@gm...> wrote: > Hey Martin, > > I don't believe the only issue is with the deserializer - I believe it > is also with the _as_data() method of SOAP::SOM. Here is the current > method: > > sub _as_data { > my $self = shift; > my $pointer = shift; > > SOAP::Data > -> new(prefix => '', name => o_qname($pointer), name => > o_lname($pointer), attr => o_lattr($pointer)) > -> set_value(o_value($pointer)); > } > > First the 'name' key to new() is duplicated - seems like a bug, and > second the value is set to o_value($pointer) - which is just the > simple hash-reference given by the deserializer. This is not recursive > - so unless o_value($pointer) return a valid SOAP::Data instance this > is useless. > > I suggest the following recursive fix: > > sub _as_data { > my $self = shift; > my $node = shift; > > my $data = SOAP::Data->name(o_qname($node))->attr(o_attr($node)); > > if (defined o_child($node)) { > my @children; > foreach my $child (@{ o_child($node) }) { > push(@children,$self->_as_data($child)); > } > $data->set_value(\SOAP::Data->value(@children)); > } else { > $data->value(o_value($node)); > } > > return $data; > } > > This now produces a correct SOAP::Data object with all the attributes > included for the subelements. > > Any feedback? jas. > > On Sat, Sep 13, 2008 at 11:32 AM, Martin Kutter > <mar...@fe...> wrote: >> ... then we probably should change the deserializer to fill all >> appropriate slots: With a XML node containing XML attributes, clearly >> the attr slot should be filled. >> >> Martin >> >> >> Am Freitag, den 12.09.2008, 17:03 +0530 schrieb Jason Stewart: >>> Hey, >>> >>> I dug a bit deeper... >>> >>> Maybe what I need to understand here is why the SOAP::SOM object that >>> is generated by the deserializer has the construct that is the >>> sub-elements without attributes as the value slot. >>> >>> The struct has 7 slots: >>> 0) qname >>> 1) attr >>> 2) child >>> 3) chars >>> 4) value >>> 5) lname >>> 6) lattr >>> >>> The child slot is an accurate representation of the sub-tree with >>> attributes, but the value slot only has element data (names of >>> elements as keys, and the text of the elements as values). >>> >>> So the whole issue is that the value slot does not include attribute >>> data. So this is not a bug as a design limitation. >>> >>> I'm back at simply wanting to get at the XML payload of the Body tag. >>> And I'm wanting to set the xml payload of the body response tag >>> without a gross hack to keep it from being wrapped in a method tag by >>> the serializer. >>> >>> Cheers, jas. >>> >> >> > |