I have spent the last few days trying to parse a SOAP response but I can’t get it to work. I would like to be able to get all the “oproduct” objects.
EDIT: I am doing it this way instead of using the built in SOAP client because I need to do parallel requests using multi_curl.
Here is my code:
$xml = simplexml_load_string($response);
$xml->registerXPathNamespace('soap-env', 'http://schemas.xmlsoap.org/soap/envelope/');
foreach ($xml->xpath('//oproduct') as $item)
{
// do something
}
Here is the response:
<soap-env:envelope xmlns:ns1="http://v3.core.com.productserve.com/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:body>
<ns1:getproductlistresponse>
<oproduct>
<iid>113133802</iid>
<icategoryid>270</icategoryid>
<imerchantid>1547</imerchantid>
<iadult>0</iadult>
<sname>The Ashes / 5th Test - England v Australia - Day 1</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=113133802&a=111402&m=1547&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/1547/113133802.jpg</sawthumburl>
<fprice>119.99</fprice>
</oproduct>
<oproduct>
<iid>113133791</iid>
<icategoryid>270</icategoryid>
<imerchantid>1547</imerchantid>
<iadult>0</iadult>
<sname>The Ashes / 1st Test - England v Australia - Day 1</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=113133791&a=111402&m=1547&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/1547/113133791.jpg</sawthumburl>
<fprice>69.99</fprice>
</oproduct>
<oproduct>
<iid>51155349</iid>
<icategoryid>428</icategoryid>
<imerchantid>513</imerchantid>
<iadult>0</iadult>
<sname>Rapitest DTM 118 Damp Test Meter</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=51155349&a=111402&m=513&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/513/51155349.jpg</sawthumburl>
<fprice>18.35</fprice>
</oproduct>
<oproduct>
<iid>187948</iid>
<icategoryid>474</icategoryid>
<imerchantid>496</imerchantid>
<iadult>0</iadult>
<sname>Rapitest Dm 10 Electrical Multimeter</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=187948&a=111402&m=496&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/496/187948.jpg</sawthumburl>
<fprice>26.71</fprice>
</oproduct>
<oproduct>
<iid>51155353</iid>
<icategoryid>428</icategoryid>
<imerchantid>513</imerchantid>
<iadult>0</iadult>
<sname>Rapitest DM 10 Electrical Multimeter</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=51155353&a=111402&m=513&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/513/51155353.jpg</sawthumburl>
<fprice>22.7</fprice>
</oproduct>
<oproduct>
<iid>49152850</iid>
<icategoryid>474</icategoryid>
<imerchantid>1366</imerchantid>
<iadult>0</iadult>
<sname>Testboy Profi LED Plus</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=49152850&a=111402&m=1366&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/1366/49152850.jpg</sawthumburl>
<fprice>44.99</fprice>
</oproduct>
<oproduct>
<iid>51155350</iid>
<icategoryid>428</icategoryid>
<imerchantid>513</imerchantid>
<iadult>0</iadult>
<sname>Rapitest ETP 116 Electrical Test Probe</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=51155350&a=111402&m=513&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/513/51155350.jpg</sawthumburl>
<fprice>17.55</fprice>
</oproduct>
<oproduct>
<iid>51155351</iid>
<icategoryid>428</icategoryid>
<imerchantid>513</imerchantid>
<iadult>0</iadult>
<sname>Rapitest ET 111 Electrical Test Meter</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=51155351&a=111402&m=513&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/513/51155351.jpg</sawthumburl>
<fprice>13.55</fprice>
</oproduct>
<oproduct>
<iid>72326941</iid>
<icategoryid>474</icategoryid>
<imerchantid>496</imerchantid>
<iadult>0</iadult>
<sname>Rapitest Etp 116 Electrical Test Probe</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=72326941&a=111402&m=496&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/496/72326941.jpg</sawthumburl>
<fprice>20.66</fprice>
</oproduct>
<oproduct>
<iid>49338340</iid>
<icategoryid>206</icategoryid>
<imerchantid>80</imerchantid>
<iadult>0</iadult>
<sname>Ladies Protest Zekke Jacket True Black</sname>
<sawdeeplink>http://www.awin1.com/pclick.php?p=49338340&a=111402&m=80&platform=cs</sawdeeplink>
<sawthumburl>http://images.productserve.com/thumb/80/49338340.jpg</sawthumburl>
<fprice>54.99</fprice>
</oproduct>
<itotalcount>6350</itotalcount>
</ns1:getproductlistresponse>
</soap-env:body>
</soap-env:envelope>
Could you clarify which version of PHP you’re using (4 or 5)? Also is there a particular reason why you don’t want to/can’t use PHP 5’s SOAP extension? Knowing this information should help us to give you a better answer.
The reason the code sample above isn’t working is that you’re looking in the wrong namespace for the oproduct nodes. While the root node is contained in the SOAP namespace the oproduct ones are under the “http://v3.core.com.productserve.com/” namespace. You also need to use the namespace alias in the XPath query. Try this, although I haven’t tested it:
Hopefully that will solve your immediate problem.
EDIT
Thanks for the clarification. Again, untested but maybe this would work:
Perhaps you need to go from the root node to the soap-Env:body to the oproduct nodes in the query. Hopefully that will work.
Further edit:
I think I’ve just cracked this. Try the following code:
Not the prettiest code but it works. I was hoping to get this to work with an XPath query but it was beyond my rudimentary knowledge of XPath. Perhaps someone else can post an answer using XPath?