Web 服务响应包含每个属性的别名命名空间。这些别名未在 WSDL 中定义。例如,WSDL 包含命名空间“http://www.example.com/SomeService http://www.example.com/SomeService" 并且请求别名在顶级节点中动态为 xmlns:ns3="http://www.example.com/SomeService"。因此响应中的属性看起来像 ns3:somePropertyName="[value] ”。
在 OPToSOAPDomConv 单元中的 TSOAPDomConv.InitObjectFromSOAP 中,它尝试查找不带名称空间前缀的属性名称。这导致查找失败并且对象属性留空。即使使用 2007 年的源文件也会发生这种情况。
我能看到的最好的解决方法是修改 InitObjectFromSOAP 例程。
在第 4181 行周围添加:
RemTypeRegistry.InfoToURI(PropList[i].PropType^, NS, PropName, IsScalar);
并更改 AttrNode.HasAttribute 以将 NS 变量作为第二个参数传递,如下所示:
if AttrNode.HasAttribute(ExternalPropName, NS) then
另外,下面几行是 SetObjectPropFromText 调用。最后一个参数是属性值,您需要将 Attr.Attributes[ExternalPropName] 更改为
SetObjectPropFromText(Instance, PropList[I], AttrNode.GetAttributeNS(ExternalPropName, NS))
当然还要声明 NS、PropName 和 IsScalar 变量。