2010-10-13 6 views
5

J'ai passé les derniers jours à essayer d'analyser une réponse SOAP, mais je n'arrive pas à la faire fonctionner. Je voudrais pouvoir obtenir tous les objets "oproduct".Comment analyser la réponse SOAP sans SoapClient

EDIT: Je le fais de cette façon au lieu d'utiliser le client SOAP intégré car j'ai besoin de faire des requêtes parallèles en utilisant multi_curl.

Voici mon code:

$xml = simplexml_load_string($response); 
$xml->registerXPathNamespace('soap-env', 'http://schemas.xmlsoap.org/soap/envelope/'); 
foreach ($xml->xpath('//oproduct') as $item) 
{ 
    // do something 
} 

Voici la réponse:

<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&amp;a=111402&amp;m=1547&amp;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&amp;a=111402&amp;m=1547&amp;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&amp;a=111402&amp;m=513&amp;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&amp;a=111402&amp;m=496&amp;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&amp;a=111402&amp;m=513&amp;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&amp;a=111402&amp;m=1366&amp;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&amp;a=111402&amp;m=513&amp;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&amp;a=111402&amp;m=513&amp;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&amp;a=111402&amp;m=496&amp;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&amp;a=111402&amp;m=80&amp;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> 

Répondre

3

Pourriez-vous préciser quelle version de PHP vous utilisez (4 ou 5)? Est-ce qu'il y a aussi une raison particulière pour laquelle vous ne voulez pas/ne pouvez pas utiliser l'extension SOAP de PHP 5? Connaître cette information devrait nous aider à mieux vous répondre.

La raison pour laquelle l'exemple de code ci-dessus ne fonctionne pas est que vous recherchez dans le mauvais espace de noms pour les nœuds oproduct. Alors que le nœud racine est contenu dans l'espace de noms SOAP, les oproduct sont sous l'espace de noms "http://v3.core.com.productserve.com/". Vous devez également utiliser l'alias d'espace de noms dans la requête XPath. Essayez ceci, bien que je ne l'ai pas testé:

$xml = simplexml_load_string($response); 
$xml->registerXPathNamespace('ns', 'http://v3.core.com.productserve.com/'); 
foreach ($xml->xpath('//ns:oproduct') as $item) 
{ 
    // do something 
} 

Espérons que cela résoudra votre problème immédiat.

EDIT Merci pour la clarification. Encore une fois, non testé, mais peut-être cela pourrait fonctionner:

$xml = simplexml_load_string($response); 
$xml->registerXPathNamespace('soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'); 
$xml->registerXPathNamespace('ns', 'http://v3.core.com.productserve.com/'); 
foreach ($xml->xpath('/soapenv:envelope/soapenv:body/ns:getproductlistresponse/ns:oproduct') as $item) 
    { 
     // do something 
    } 

Peut-être vous avez besoin d'aller du nœud racine au savon Env: corps aux nœuds oproduct dans la requête. J'espère que cela fonctionnera.

Autre modification: Je pense que j'ai juste craqué ceci. Essayez le code suivant:

$xml = simplexml_load_string($response); 
$ns = $xml->getNamespaces(true); 
$soap = $xml->children($ns['soap-env']); 
$getproductlistresponse = $soap->body->children($ns['ns1']); 
foreach ($getproductlistresponse->children() as $item) 
{ 
    //This example just accesses the iid node but the others are all available. 
    echo (string) $item->iid . '<br />'; 
} 

Pas le plus joli code mais ça marche. J'espérais que cela fonctionnerait avec une requête XPath mais cela dépassait ma connaissance rudimentaire de XPath. Peut-être que quelqu'un d'autre peut poster une réponse en utilisant XPath?

+0

Merci Jeremy d'avoir répondu. J'utilise PHP5. La raison pour laquelle je le fais de cette façon est parce que j'ai besoin de faire des requêtes parallèles avec multi_curl. J'ai essayé ce que tu as suggéré, mais ça revient faux maintenant. – Joe

+0

Salut Joe, oublie ma dernière édition. Je pensais ouvrir un éditeur de code et essayer cela, mais le problème que je rencontre est que je ne peux pas obtenir simplexml_load_string() pour analyser la chaîne de réponse. Il retourne juste un objet SimpleXML vide. Je continuerai à essayer et je posterai si je reçois la réponse. – Jeremy

+0

Merci pour votre aide Jeremy. Je vais essayer de jouer avec le code que vous avez ajouté ci-dessus et voir si je peux le faire fonctionner. – Joe

5

PHP est livré avec un client SOAP qui devrait faire en sorte que vous n'avez pas à analyser manuellement XML SOAP. Voir ici: http://php.net/manual/en/book.soap.php

Éditer: Pour plus de clarté, le client SOAP ne fait pas partie de PHP, mais plutôt une extension.

+0

Ceci est correct, à commencer par PHP5. – brendan

+0

Désolé les gars, j'aurais dû être plus clair. Je fais de cette façon parce que j'ai besoin d'utiliser multi_curl pour pouvoir faire des requêtes parallèles. – Joe

+1

Existe-t-il un moyen d'utiliser le client soap uniquement pour analyser une réponse au savon? – Joe

Questions connexes