I also had the same problem, and this is how I solved it, maybe it can also help others.
"xsi: nil = true" is set, if the value of the soap data object is undef, set it to arrayref to solve the problem.
See below code for reference:
Soap format:
< m:clHotelIdInfo>< m:HotelIdInfo xsi:nil=true id="1219615" />< /m:clHotelIdInfo>
The structure of the soap object
*bless( { '_name' => 'clHotelIdInfo', '_signature' => [], '_value' => [ \bless( { '_signature' => [], '_value' => [ bless( { '_name' => 'HotelIdInfo', '_signature' => [], **'_value' => [ undef ],** '_prefix' => 'm', '_attr' => { 'id' => '1219615' } }, 'SOAP::Data' ) ], '_attr' => {} }, 'SOAP::Data' ) ], '_prefix' => 'm', '_attr' => {} }, 'SOAP::Data' )*
Expected soap format:
< m:clHotelIdInfo>< m:HotelIdInfo id="1219615" /></ m:clHotelIdInfo>
So, the structure of the Soap object should be:
*bless( { '_name' => 'clHotelIdInfo', '_signature' => [], '_value' => [ \bless( { '_signature' => [], '_value' => [ bless( { '_name' => 'HotelIdInfo', '_signature' => [], **'_value' => [],** '_prefix' => 'm', '_attr' => { 'id' => '1219615' } }, 'SOAP::Data' ) ], '_attr' => {} }, 'SOAP::Data' ) ], '_prefix' => 'm', '_attr' => {} }, 'SOAP::Data' )*
If you closely monitor objects, the HotelIdInfo value was not previously before, which, when changing to arrayref, helped me get rid of "xsi: nil = true".
I did not have to change any of the existing cpan modules. Just set the value of arrayref instead of undef. This solution is in perl.