我正在尝试在php中的服务器和C中的客户端之间建立Soap连接。我的服务器正在使用一个工作wsdl文件和一个类来添加这些方法。我可以向Wireshark确认,我的客户请求得到了很好的接收和正确的处理。
我的问题是无法读取服务器发送的XML元素的值,因为名称空间不同。通过在我的客户端中添加调试日志,我发现错误是:
Tags 'state' and 'ns2:state' match but namespaces differ
问题:
问题似乎是服务器响应不包含任何默认名称空间:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.w3.org/2005/08/adressing"
xmlns:ns2="http://www.namespace1/">
<env:Body>
<ns2:HelloResponse>
<state>OK</state>
<intElement>123</intElement>
</ns2:HelloResponse>
</env:Body>
</env:Envelope>
看起来<state>
和<intElement>
不在任何命名空间中,因此它无法匹配其中一个客户端。在我的Wsdl文件中,这些元素属于xmlns:s="http://www.w3.org/2001/XMLSchema"
我尝试了什么:
显而易见的解决方案是为这些元素添加一个名称空间,但我找不到方法。在我的php服务器中,我可以修改任何传入的请求,但不会影响任何传出的响应(或者至少我没有找到如何做(。
第二个解决方案:将描述这些元素的名称空间添加到我的客户端中的namespace结构中,然后使用set_namespace()
函数。
但我无法让它们发挥作用,请记住,我还是XML/Soap世界的新手,任何帮助都将不胜感激。
如前所述,解决方案是向这些元素添加相应的命名空间。
我设法使用ob_get_contents((并将命名空间添加到<ns2:HelloResponse>。使用Wireshark对这类东西真的很有用。