2010-10-13 13 views
5

Ho passato gli ultimi giorni a cercare di analizzare una risposta SOAP ma non riesco a farlo funzionare. Mi piacerebbe essere in grado di ottenere tutti gli oggetti "oproduct".Come analizzare la risposta SOAP senza SoapClient

EDIT: lo sto facendo in questo modo invece di utilizzare il client SOAP integrato perché devo eseguire richieste parallele utilizzando multi_curl.

Ecco il mio codice:

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

Ecco la risposta:

<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> 

risposta

3

Puoi chiarire quale versione di PHP stai usando (4 o 5)? C'è anche una ragione particolare per cui non vuoi/non puoi usare l'estensione SOAP di PHP 5? Conoscere queste informazioni dovrebbe aiutarci a darti una risposta migliore.

La ragione per cui il codice sopra riportato non funziona è che stai cercando lo spazio dei nomi sbagliato per i nodi di oproduct. Mentre il nodo radice è contenuto nello spazio dei nomi SOAP, quelli di oproduct si trovano nello spazio dei nomi "http://v3.core.com.productserve.com/". È inoltre necessario utilizzare l'alias dello spazio dei nomi nella query XPath. Prova questo, anche se non l'ho provato:

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

Speriamo che risolva il tuo problema immediato.

MODIFICA Grazie per il chiarimento. Anche in questo caso, non testato ma forse questo dovrebbe funzionare:

$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 
    } 

forse avete bisogno di andare dal nodo radice alla soap-Env: corpo ai nodi oproduct nella query. Spero che funzionerà.

Ulteriore modifica: Penso di aver appena rotto questo. Prova il seguente codice:

$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 />'; 
} 

Non è il codice più carino ma funziona. Speravo di farlo funzionare con una query XPath ma era al di là della mia conoscenza rudimentale di XPath. Forse qualcun altro può pubblicare una risposta usando XPath?

+0

Grazie a Jeremy per aver risposto. Sto usando PHP5. Il motivo per cui lo sto facendo in questo modo è perché ho bisogno di fare richieste parallele con multi_curl. Ho provato quello che hai suggerito, ma ora restituisce false. – Joe

+0

Ciao Joe, dimentica la mia ultima modifica. Ho pensato di aprire di crack un editor di codice e provare questo, ma il problema che sto avendo è che non riesco a ottenere simplexml_load_string() per analizzare la stringa di risposta. Restituisce solo un oggetto SimpleXML vuoto. Continuerò a provare e posteremo indietro se avrò la risposta. – Jeremy

+0

Grazie per il tuo aiuto Jeremy. Proverò a scherzare con il codice che hai aggiunto sopra e vedere se riesco a farlo funzionare. – Joe

5

PHP è dotato di un client SOAP che dovrebbe fare in modo che non c'è bisogno di analizzare manualmente SOAP XML. Vedi qui: http://php.net/manual/en/book.soap.php

Modifica: Per chiarezza, il client SOAP non fa parte di PHP, piuttosto un'estensione.

+0

Questo è corretto, a partire da PHP5. – brendan

+0

Scusate ragazzi, avrei dovuto essere più chiaro. Sto facendo in questo modo perché ho bisogno di usare multi_curl in modo da poter fare richieste parallele. – Joe

+1

Esiste un modo per utilizzare il client soap solo per analizzare una risposta soap? – Joe

Problemi correlati