nusoap_client - soapclient php ejemplo
Cómo analizar la respuesta SOAP sin SoapClient (2)
PHP viene con un cliente SOAP que debe hacerlo para que no tenga que analizar manualmente SOAP XML. 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.
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".
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&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>
¿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.
El motivo por el que el ejemplo de código anterior no está funcionando es que está buscando en el espacio de nombres incorrecto para los nodos oproducto. 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. Prueba 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 tu problema inmediato.
EDITAR Gracias por la aclaración. Nuevamente, no probado pero quizás 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 necesite ir desde el nodo raíz al jabón-Env: cuerpo a los nodos oproducto en la consulta. Espero que eso funcione.
Edición adicional: 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?