2010-10-13 11 views
5

He pasado los últimos días tratando de analizar una respuesta SOAP pero no puedo hacer que funcione. Me gustaría poder obtener todos los objetos "oproductos".Cómo analizar la respuesta SOAP sin SoapClient

EDITAR: Lo estoy haciendo de esta manera en lugar de usar el cliente SOAP integrado porque necesito hacer solicitudes paralelas usando multi_curl.

Aquí está mi código:

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

Aquí está la respuesta:

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

Respuesta

3

¿Podría aclarar qué versión de PHP está usando (4 o 5)? Además, ¿hay algún motivo particular por el que no desee/no pueda utilizar la extensión SOAP de PHP 5? Conocer esta información debería ayudarnos a darle una mejor respuesta.

La razón por la cual el ejemplo de código anterior no está funcionando es que está buscando en el espacio de nombres incorrecto para los nodos oproductos. Mientras que el nodo raíz está contenido en el espacio de nombres SOAP, los oproductos están en el espacio de nombres "http://v3.core.com.productserve.com/". También necesita usar el alias del espacio de nombres en la consulta XPath. Pruebe esto, aunque no lo he probado:

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

Espero que eso resuelva su problema inmediato.

EDIT Gracias por la aclaración. De nuevo, no probado, pero tal vez esto funcionaría:

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

Tal vez usted necesita para ir desde el nodo raíz al jabón-Env: cuerpo a los nodos oproduct en la consulta. Espero que eso funcione.

Editar: Creo que acabo de descifrar esto. Pruebe el siguiente código:

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

No es el código más bonito, pero funciona. Esperaba que esto funcionara con una consulta XPath, pero estaba más allá de mi conocimiento rudimentario de XPath. ¿Quizás alguien más puede publicar una respuesta usando XPath?

+0

Gracias Jeremy por responder. Estoy usando PHP5. La razón por la que lo hago de esta manera es porque necesito hacer solicitudes paralelas con multi_curl. Intenté lo que sugeriste, pero ahora está volviendo falso. – Joe

+0

Hola Joe, olvida mi última edición. Pensé en abrir un editor de código y probar esto, pero el problema que estoy teniendo es que no puedo obtener simplexml_load_string() para analizar la cadena de respuesta. Simplemente devuelve un objeto SimpleXML vacío. Seguiré intentando y publicaré de nuevo si recibo la respuesta. – Jeremy

+0

Gracias por su ayuda Jeremy. Trataré de perder el tiempo con el código que agregué arriba y veré si puedo hacerlo funcionar. – Joe

5

PHP viene con un cliente SOAP que debe hacerlo por lo que no tiene que analizar manualmente XML SOAP. Vea aquí: http://php.net/manual/en/book.soap.php

Editar: Para mayor claridad, el cliente SOAP no es parte de PHP, sino una extensión.

+0

Esto es correcto, comenzando con PHP5. – brendan

+0

Lo siento chicos, debería haber sido más claro. Lo hago de esta manera porque necesito usar multi_curl para poder hacer solicitudes paralelas. – Joe

+1

¿Hay alguna manera de usar el cliente de jabón solo para analizar una respuesta de jabón? – Joe

Cuestiones relacionadas