SoapClient Escaping XML Tags

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • brandonkirsch
    New Member
    • Sep 2006
    • 7

    SoapClient Escaping XML Tags

    Hey guys,
    I recently lost hours to the PHP 5.2.1 SoapClient when trying to use a remote webservice. There are two methods I have to use, the first one worked like a charm and the second one has me fuming mad. The two methods are "GetSessionToke n" which expects two strings, and "SetProjectData " which expects XML wrapped in a CDATA tag.

    My problem is that the XML I pass to SetProjectData is being escaped by the PHP SoapClient and I don't know how to turn this off. The XML characters < > and & are being escaped to &lt; &gt; and &amp; -- I need this to stop! It's not documented on php.net anywhere and I don't know where to turn.

    Sample:
    [code=php]
    $client = new SoapClient('my. wsdl',array('tr acing'=>1));

    $getSessionToke nParams = array('username '=>$username,'p assword'=>$pass word); //When passed to the webservice in the next line, this creates two XML tags, <username> and <password> with the appropriate values inside

    $client->GetSessionToke n($getSessionTo kenParams); //Runs properly, gives me a session token.

    $setProjectData Payload = "<![CDATA[<data><projecti nfo>details</projectinfo></data>]]>"; //Webservice expects inside XML to be wrapped in CDATA

    $setProjectData Param = array("sdsXML" => $setProjectData Payload); //Webservice expects CDATA to be inside one sdsXML tag

    //Here's where it breaks:
    $client->SetProjectData ($setProjectDat aParam); //Remote webservice fails with "not properly formated XML" error
    echo $client->__getLastReque st(); //Output the Webservice request and what do I find? $setProjectData Payload has all of the XML tags <, > and & have all been escaped and I didn't do it. The sdsXML tag itself is not escaped, only its contents. Why is this happening? Where is this documented?
    [/code]

    [Please use CODE tags when posting source code. Thanks! --pbmods]

    Most importantly: How the heck do I turn "feature" off? I just want it to pass the literal data I send to it, please no chracter escaping!
    Last edited by pbmods; Jun 8 '07, 10:58 PM. Reason: Added code tags. Cleaned up the language an eensy bit.
  • bucabay
    New Member
    • Apr 2007
    • 18

    #2
    Originally posted by brandonkirsch
    Hey guys,
    I recently lost hours to the PHP 5.2.1 SoapClient when trying to use a remote webservice. There are two methods I have to use, the first one worked like a charm and the second one has me fuming mad. The two methods are "GetSessionToke n" which expects two strings, and "SetProjectData " which expects XML wrapped in a CDATA tag.

    My problem is that the XML I pass to SetProjectData is being escaped by the PHP SoapClient and I don't know how to turn this off. The XML characters < > and & are being escaped to &lt; &gt; and &amp; -- I need this to stop! It's not documented on php.net anywhere and I don't know where to turn.

    Sample:
    [code=php]
    $client = new SoapClient('my. wsdl',array('tr acing'=>1));

    $getSessionToke nParams = array('username '=>$username,'p assword'=>$pass word); //When passed to the webservice in the next line, this creates two XML tags, <username> and <password> with the appropriate values inside

    $client->GetSessionToke n($getSessionTo kenParams); //Runs properly, gives me a session token.

    $setProjectData Payload = "<![CDATA[<data><projecti nfo>details</projectinfo></data>]]>"; //Webservice expects inside XML to be wrapped in CDATA

    $setProjectData Param = array("sdsXML" => $setProjectData Payload); //Webservice expects CDATA to be inside one sdsXML tag

    //Here's where it breaks:
    $client->SetProjectData ($setProjectDat aParam); //Remote webservice fails with "not properly formated XML" error
    echo $client->__getLastReque st(); //Output the Webservice request and what do I find? $setProjectData Payload has all of the XML tags <, > and & have all been escaped and I didn't do it. The sdsXML tag itself is not escaped, only its contents. Why is this happening? Where is this documented?
    [/code]

    [Please use CODE tags when posting source code. Thanks! --pbmods]

    Most importantly: How the heck do I turn "feature" off? I just want it to pass the literal data I send to it, please no chracter escaping!
    I haven't used PHP's built in SOAP client so I can't help you with how to turn the escaping off.. however, if you remove the <![CDATA[ tags it would be equivalent to the actual CDATA wrapped in <![CDATA[.
    It would work unless the soap server actually needs the <![CDATA[ tags?

    Comment

    • brandonkirsch
      New Member
      • Sep 2006
      • 7

      #3
      The server expects the CDATA tags for one, and more importantly the XML I send inside of CDATA is being escaped anyways: Even if I remove the CDATA text, I still end up with &lt;myxmltag&gt ; and the remote call fails.

      I can't be the first person to use CDATA with PHP's SoapClient. I just can't figure out why in the world my data is being escaped.

      Edit** In my original code, I pass:
      Code:
      array('tracing'=>1)
      in the SoapClient constructor but the proper value is actually
      Code:
      array('trace'=>1)

      Comment

      • keeby
        New Member
        • Oct 2007
        • 1

        #4
        I just wrote a simple class to do it.

        Signed up to help you out, so, I hope it does!

        Code:
        class XMLClient extends SoapClient {
        	
            public function XMLClient($wsdl) {
            	try {
            	  parent::__construct($wsdl);
            	} catch (SoapFault $exception) {
            		$this->error = $exception;
            	}
            }
            
        	public function __doRequest($request, $location, $action, $version) {
            	$request = str_replace("&lt;", "<", $request);
            	$request = str_replace("&gt;", ">", $request);
            	print "Request - " . $request;
            	return parent::__doRequest($request, $location, $action, $version );
            }
        }
        Usage:

        Code:
        $x = XMLClient("my.wsdl");
        $x->getSomeBooks("<some><xml><content></content></xml></some>");

        Comment

        • Roel Veldhuizen
          New Member
          • Mar 2011
          • 1

          #5
          I had the same problem. After some trail and error. If found a solution. You could use SoapVar with XSD_ANYXML.

          Code:
          new SoapVar("<param2><![CDATA[<html><body>Some content</body></html>]]> </param2>", XSD_ANYXML)
          Blogged it over here: http://bit.ly/e8oPrt

          Comment

          Working...