I am sending a request for response to a WSDL in PHP (code below). The response is structured in a way that I’m not sure how to extract data from it. It comes back as an object with the XML inside. Is there a standard way of parsing the XML of this object?
Here is my code:
<?php $wsdl="http://192.168.0.31/WSSmartConnect/cCustomerDocument.asmx?wsdl"; $companyID=1; $sysUser='dburchfield'; $accountNum=$_POST['accountNum']; $trxUniqueKey=0; $startDate=$_POST['startDate']; $endDate=$_POST['endDate']; $documentType=$_POST['documentType']; $tankNum=0; $serviceNum=0; $locationNum=0; $param=array( 'pCompanyID'=>$companyID, 'pSysUser'=>$sysUser, 'pAccountNum'=>$accountNum, 'pTrxUniqueKey'=>$trxUniqueKey, 'pFromDate'=>$startDate, 'pToDate'=>$endDate, 'pDocumentType'=>$documentType, 'pTankNum'=>$tankNum, 'pServiceNum'=>$serviceNum, 'pLocationNum'=>$locationNum ); $client = new SoapClient($wsdl, array('trace' => 1)); $soapCall = $client->LoadCustomerDocuments($param); //$response = $client->__getLastResponse(); echo "<strong>" . $startDate . " - " . $endDate . "</strong><br><br>"; var_dump($soapCall);
?>
Here is the response I get. How do I pull the XML out and parse for keys?
C:wamp64wwwE3PortalsmartConnect.php:85: object(stdClass)[2] public 'LoadCustomerDocumentsResult' => object(stdClass)[3] public 'any' => string '<xs:schema xmlns:mstns="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd" xmlns="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="DSCustomerDocumentInfo" targetNamespace="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd" attributeFormDefault="qualified" elementFormDefault="qualified"><xs:element name="DSCustomerDocumentInfo" msdata:IsDataSet="true" msdata:Us'... (length=6063)
Here is the WSDL response I get when I use SoapUI:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <LoadCustomerDocumentsResponse xmlns="http://www.addsys.com/"> <LoadCustomerDocumentsResult> <xs:schema id="DSCustomerDocumentInfo" targetNamespace="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:mstns="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd" xmlns="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="DSCustomerDocumentInfo" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="CustomerDocumentInfo"> <xs:complexType> <xs:sequence> <xs:element name="doc_type" type="xs:short" minOccurs="0"/> <xs:element name="doc_id" type="xs:int" minOccurs="0"/> <xs:element name="doc_date" type="xs:dateTime" minOccurs="0"/> <xs:element name="has_print_info" type="xs:int" minOccurs="0"/> <xs:element name="tank_num" type="xs:short" minOccurs="0"/> <xs:element name="service_num" type="xs:short" minOccurs="0"/> <xs:element name="location_num" type="xs:short" minOccurs="0"/> <xs:element name="doc_type_desc" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <DSCustomerDocumentInfo xmlns="http://www.addsys.com/CustomerDocument/DSCustomerDocumentInfo.xsd"> <CustomerDocumentInfo diffgr:id="CustomerDocumentInfo1" msdata:rowOrder="0"> <doc_type>23</doc_type> <doc_id>506342</doc_id> <doc_date>2021-01-04T00:00:00-06:00</doc_date> <has_print_info>1</has_print_info> <tank_num>0</tank_num> <service_num>0</service_num> <location_num>1</location_num> <doc_type_desc>WDMS Invoices</doc_type_desc> </CustomerDocumentInfo> <CustomerDocumentInfo diffgr:id="CustomerDocumentInfo2" msdata:rowOrder="1"> <doc_type>23</doc_type> <doc_id>509603</doc_id> <doc_date>2021-01-07T00:00:00-06:00</doc_date> <has_print_info>1</has_print_info> <tank_num>0</tank_num> <service_num>0</service_num> <location_num>1</location_num> <doc_type_desc>WDMS Invoices</doc_type_desc> </CustomerDocumentInfo> </DSCustomerDocumentInfo> </diffgr:diffgram> </LoadCustomerDocumentsResult> </LoadCustomerDocumentsResponse> </soap:Body> </soap:Envelope>
Advertisement
Answer
It looks like your $soapCall->LoadCustomerDocumentsResult->any contains valid XML, so you can just use any of built-in XML classes:
$my_result_var = new SimpleXMLElement($soapCall->LoadCustomerDocumentsResult->any);
or
$reader = new XMLReader(); $reader->XML($soapCall->LoadCustomerDocumentsResult->any); $reader->read();
Or you can try helper classes from composer – something like phpro/soap-client
Updated: Ok, so you have a bit more complicated xml than usual, so here are some tips:
- to make your xml valid you need only one outer element, so
"<xml>" . $soapCall->LoadCustomerDocumentsResult->any . "</xml>"
will fix it.
- You have unusual namespace in your second element. To make it work, you need to use registerXPathNamespace function:
$my_result_var = new SimpleXMLElement("<xml>" . $soapCall->LoadCustomerDocumentsResult->any . "</xml>"); $my_result_var->registerXPathNamespace('d', 'urn:schemas-microsoft-com:xml-diffgram-v1');
Next you need to get your element by namespace:
$diffgram = $my_result_var->xpath("//d:diffgram"); foreach($diffgram[0]->DSCustomerDocumentInfo->CustomerDocumentInfo as $docInfo) { var_dump($docInfo->doc_id); }
Actually after $diffgram[0] you can use your second element as regular xml.
Hope it helps.