I hadn't even noticed the "SOAP-ENV" vs. "soapenv" - Salesforce is happily accepting the former in the custom property I created, so I concur with your view that this is also a non-issue.
Yes, the example Salesforce code I sent has 2 additional namespaces. All the calls I have looked at so far seem to have the one with the "urn" ID but the second varies on a call-specific basis. I've changed my custom property to have a placeholder into which I can replace the various call-specific namespaces.
The call I've been using for testing has just the "urn" namespace. I wasn't using the SOAP.AddNamespace() function - just the additional parameters of the revised SOAP.RPCRequest() - so I'm not sure why this is failing.
I'll focus on getting a few more calls working with the Salesforce-specific custom property and then I'll provide feedback on the common requirement. Given the variations on a per-call basis, it may be that the right approach is to create a Salesforce-specific SOAP library - with its own custom property and call-specific functions - that then uses libSOAP as a transport mechanism.
Thanks for playing

Best,
Keith..