Не могли бы вы уточнить, какую версию PHP вы используете (4 или 5)?Также есть ли конкретная причина, по которой вы не хотите / не можете использовать расширение SOAP в PHP 5?Знание этой информации должно помочь нам дать вам лучший ответ.
Причина, по которой вышеприведенный пример кода не работает, заключается в том, что вы ищете неправильное пространство имен для узлов oproduct.Хотя корневой узел содержится в пространстве имен SOAP, oproduct находятся под "http://v3.core.com.productserve.com/" пространством имен. Вам также необходимо использовать псевдоним пространства имен в запросе XPath. Попробуйте это, хотя я не проверял его:
$xml = simplexml_load_string($response);
$xml->registerXPathNamespace('ns', 'http://v3.core.com.productserve.com/');
foreach ($xml->xpath('//ns:oproduct') as $item)
{
// do something
}
Надеюсь, это решит вашу непосредственную проблему.
РЕДАКТИРОВАТЬ Спасибо за разъяснения. Опять не проверено, но, возможно, это сработает:
$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
}
Возможновам нужно перейти от корневого узла к soap-Env: body к узлам oproduct в запросе. Надеюсь, это сработает.
Дальнейшее редактирование: Я думаю, что я только что взломалпопробуйте следующий код:
$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 />';
}
Не самый красивый код, но он работает. Я надеялся заставить его работать с запросом XPath, но это было за пределами моих элементарных знаний XPath. Возможно, кто-то другой можетопубликовать ответ, используя XPath?