XML encoding issue
| From: | Graeme Merrall | Date: | Tue, 27 Feb 2007 22:59:37 +0000 |
| Subject: | XML encoding issue | ||
| Groups: | php.soap | ||
| Request: | Send a blank email to php-soap+get-2473@lists.php.net to get a copy of this message | ||
Not quite sure what's going on here so would appreciate some help.
I'm connecting to a SOAP service and the service receives and responds
correctly to a request. I've confirmed this by looking at teh HTTP
headers flowing backwards and forwads. However, the soap class returns
a fault with the text "Error: XML error on line 1 col 4 byte 4 not
well-formed (invalid token)" I've tried various options of literal vs
document but no joy.
Any pointers appreciated.
Cheers,
Graeme
OUTGOING
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
<SOAP-ENV:Body><queryTable xmlns="http://reportingapi.services.example.com"> <query> <expression>SHOW ACCOUNT.tables</expression> <language>en_us</language></query></queryTable> </SOAP-ENV:Body> </SOAP-ENV:Envelope> INCOMING <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:queryTableResponse xmlns:ns1="http://reportingapi.services.example.com"> <ns1:queryTableResult> <ns1:tableHeader>
<ns1:name>ACCOUNT</ns1:name>CODE <?php require_once 'SOAP/Client.php'; // lots of set up stuff $wsdl_url = 'ReportingAPI.wsdl'; // including various client options
$WSDL = new SOAP_WSDL($wsdl_url);$client = $WSDL->getProxy(); $client->setOpt('trace', 1); $client->setEncoding('UTF-8'); // turns out you needed to make nested values // these equate to XML tags $query_sql =& new SOAP_Value('expression', 'string', 'SHOW ACCOUNT.tables'); $query_lang =& new SOAP_Value('language', 'string', 'en_us'); $query_packet =& new SOAP_Value('query', 'query', array($query_sql, $query_lang)); $result = $client->queryTable(array($query_packet)); if (PEAR::isError($result)) { echo 'Error: ' . $result->getMessage() . "\n"; echo $client->getWire(); } else { echo "Error free!"; }