php 如何在没有 SoapClient 的情况下解析 SOAP 响应
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3928350/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to parse SOAP response without SoapClient
提问by Joe
I have spent the last few days trying to parse a SOAP response but I can't get it to work. I would like to be able to get all the "oproduct" objects.
过去几天我一直在尝试解析 SOAP 响应,但我无法让它工作。我希望能够获得所有“oproduct”对象。
EDIT: I am doing it this way instead of using the built in SOAP client because I need to do parallel requests using multi_curl.
编辑:我这样做而不是使用内置的 SOAP 客户端,因为我需要使用 multi_curl 执行并行请求。
Here is my code:
这是我的代码:
$xml = simplexml_load_string($response);
$xml->registerXPathNamespace('soap-env', 'http://schemas.xmlsoap.org/soap/envelope/');
foreach ($xml->xpath('//oproduct') as $item)
{
// do something
}
Here is the response:
这是回应:
<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 Hymanet 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>
采纳答案by Jeremy
Could you clarify which version of PHP you're using (4 or 5)? Also is there a particular reason why you don't want to/can't use PHP 5's SOAP extension? Knowing this information should help us to give you a better answer.
您能否说明您使用的是哪个版本的 PHP(4 或 5)?还有一个特殊的原因为什么您不想/不能使用 PHP 5 的 SOAP 扩展?了解这些信息应该有助于我们为您提供更好的答案。
The reason the code sample above isn't working is that you're looking in the wrong namespace for the oproduct nodes. While the root node is contained in the SOAP namespace the oproduct ones are under the "http://v3.core.com.productserve.com/" namespace. You also need to use the namespace alias in the XPath query. Try this, although I haven't tested it:
上面的代码示例不起作用的原因是您正在为 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
}
Hopefully that will solve your immediate problem.
希望这将解决您当前的问题。
EDITThanks for the clarification. Again, untested but maybe this would work:
编辑感谢您的澄清。同样,未经测试,但也许这会奏效:
$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
}
Perhaps you need to go from the root node to the soap-Env:body to the oproduct nodes in the query. Hopefully that will work.
也许您需要在查询中从根节点到 soap-Env:body 再到 oproduct 节点。希望这会奏效。
Further edit:I think I've just cracked this. Try the following code:
进一步编辑:我想我刚刚破解了这个。试试下面的代码:
$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 />';
}
Not the prettiest code but it works. I was hoping to get this to work with an XPath query but it was beyond my rudimentary knowledge of XPath. Perhaps someone else can post an answer using XPath?
不是最漂亮的代码,但它有效。我希望让它与 XPath 查询一起工作,但这超出了我对 XPath 的基本了解。也许其他人可以使用 XPath 发布答案?
回答by Joe
PHP comes with a SOAP client that should make it so you don't have to manually parse SOAP XML. See here: http://php.net/manual/en/book.soap.php
PHP 附带了一个 SOAP 客户端,它应该可以使您不必手动解析 SOAP XML。见这里:http: //php.net/manual/en/book.soap.php
Edit: For clarity, the SOAP client is not part of PHP, rather an extension.
编辑:为了清楚起见,SOAP 客户端不是 PHP 的一部分,而是一个扩展。