Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re^2: SOAP::Deserializer problem

by axelrose (Scribe)
on Jul 29, 2007 at 11:32 UTC ( #629392=note: print w/replies, xml ) Need Help??


in reply to Re: SOAP::Deserializer problem
in thread SOAP::Deserializer problem

I tried this:
my $soap = SOAP::Lite->uri($uri)->proxy( $proxyUrl, timeout => 5 ); my $method = SOAP::Data->name("command")->attr( { 'template' => 'sample', 'method' => 'execute', 'loginname' => 'me', } ); my $som = $soap->call($method); if ( $som->fault ) { die $som->fault->faultstring } print $som->valueof('/Envelop/Body/command');
and then in a debugging session:
DB<1> x $som->valueof('/Envelope/Body/command') 0 HASH(0x1bb793c) 'message' => HASH(0x1bb793c) -> REUSED_ADDRESS DB<2> x $som->valueof('/Envelope/Body/command/message') 0 HASH(0x1bb793c) 'message' => HASH(0x1bb793c) -> REUSED_ADDRESS
I cannot see how to access the subnodes ... Thanks for any help! Axel.

Replies are listed 'Best First'.
Re^3: SOAP::Deserializer problem
by rahed (Scribe) on Jul 29, 2007 at 18:16 UTC
    I didn't realise you don't code the request like this:
    $method = SOAP::Data->name('command'=>'value');

    So to access attribute values you should use

    $attr_value = $som->dataof('//Envelope/Body/command')->attr->{'template'};
    or
    $attr_value = $som->dataof('//command')->attr->{'template'};
    (I don't remember which one because don't use attributes.)

    This should hold for
    <Envelope>
    <Body>
    <command template="foo">100</command>
    </Body>
    </Envelope>

    and $attr_value is foo, command value is 100.

    Docs are in SOAP/SOM.pod of perl/site/lib directory.
      Sorry, my first go was more complicated than necessary. Here is a second simplified go to demonstrate my problem:
      #!/usr/bin/perl use warnings; use strict; use SOAP::Lite; my $xml = <<'eof'; <?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/env +elope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <command id="1"> <message id="2"> <time time="27.07.2007-10:37:49 +0200"/> </message> </command> </SOAP-ENV:Body> </SOAP-ENV:Envelope> eof my $som = SOAP::Deserializer->deserialize($xml); print "time = ", $som->dataof('//command/message/time')->attr->{time}, + "\n"; print "done.\n";
      Output is
      time = 27.07.2007-10:37:49 +0200 done.
      but
      Can't call method "attr" on an undefined value at deserialize-test2.pl + line 23.
      as soon as the id attributes of command and message are identical. I wouldn't care if I could get the raw XML from the SOAP response. Axel.
        You want to avoid the use of id attributes and rename them to some other name or qualify them in the namespace.

        SOAP protocol uses id/href attribute pairs to identify its entities.

        If you specify outputxml('true') for a soap object, a method will return raw xml code.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://629392]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2020-10-21 16:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (220 votes). Check out past polls.

    Notices?