Just in case this burns someone else

Talking to a web service that returns an array of mixed complex types (ooh goody!)

soap4r returns a lot of SOAP::Mapping::Object

These pretend to be a kind of hash (of hashes of hashes if you go really deep), so I could get my proposal back by the rather horrible

response.submitResult.returnMsg[‘Proposal’]

(lots of console work required to get this far .. :))

I needed the proposal’s ID and it was nowhere to be seen. When I looked at the wire trace it told me that the proposal ID was being returned as an attribute of the Proposal XML node.

Lots of pain and headscratching later discovered a blog post talking about the semi-hidden xmlattr method, this is a proper hash but it is indexed using the qualified name class XSD::QName

So, to get the ID out we end up with …

proposal_id_key = XSD::QName.new(nil,‘proposalID’)
response.submitResult.returnMsg[‘Proposal’].
xmlattr[proposal_id_key]

Let the joy be unconfined … SOAP is another unnecessary PIA. Most of the time you could just post XML direct using HTTP. I can’t see any benefit for the additional complexity.

If we did’t have soap4r I’d still be banging my head on the desk so +1 for that …

Top tip, you can set $DEBUG=true in the console to get the wire trace.