Я не знаю, что является причиной ошибки, но да, есть способ обойти это. Вы можете использовать обработчик RIO_AfterExecute (), чтобы изменить SOAPResponse, чтобы изменить XML, чтобы «подогнать его». Это уродливый, «больший молоток» подход, но в конечном итоге он позволяет вам манипулировать данными, чтобы обойти все виды проблем.
Глядя на ваши два примера, я бы попробовал использовать stringreplace для замены 'xsd: anyType [] [1]' на 'xsd: anyType [] [3]'. Если это не сработает, попробуйте ввести другой набор данных с пустыми значениями, чтобы создать впечатление, что он не один.
Вам понадобится объект RIO, а затем вы подключите его к такому обработчику:
MyRIO.OnAfterExecute := self.RIO_AfterExecute;
В моем случае «self» относится к классу, который я написал вокруг моих SOAP-материалов.
Обязательно установите свою позицию обратно на 0, когда закончите возиться с запросом.
Вот некоторый непроверенный код:
procedure MyWrapper.RIO_AfterExecute(const MethodName: string; SOAPResponse: TStream);
var
SL : TStringList;
begin
// do stuff with the SOAPResponse here.
// It's a stream, so I like to load it into a stringlist
// ex:
SL := TStringList.Create;
try
SOAPResponse.Position := 0;
SL.LoadFromSTream(SOAPREsponse);
// fiddle with stringreplace here, to doctor up the SL.text.
SOAPResponse.Position := 0;
SOAPResponse.size := length(SL.Text);
SL.SaveToStream(SOAPResponse);
finally
SL.free;
end;
end;