You have hit upon the wonderful world of xml and namespaces. Not an easy task but it is doable. As you have discovered the prefix is arbitrary and depends on the sending system. Whether it is fully qualified or not will determine if all elements have a prefix or like in the case of .Net a default namespace is used so no prefixes. It all varies depending on the vendor.
The queryXmlNode does work, you will need to wild card the search string for prefixes so that it will accept all prefixes or none. Something like - //:createRequest/:firstname/text() using xql will do the trick. This can be tedious for large documents. You can also use the getBodyEntries and loop over it mapping it to a Document using xmlNodeToDocument. You can then map that to a internal document and prefixes will not be brought over.
Mark C is the soap master, he may be able to offer some more insight.