I am building a custom serializer and I am having a problem with setting the
type in a MessageElement while making a client call.
I need to set the type for an object to a Qname of
{http://www.w3.org/1999/XMLSchema}string. However, if I call setType it
makes the QName use the namespace URI of http://www.w3.org/2001/XMLSchema.
The service I am using expects it to be the first one. The second URI is of
course one of the SOAP11Constants I use by default. First I guess I would
like to know why it normalizes this to the second when I specify it as the
first. Is there a way to disable this?
In addition, I tried to add an attribute using the addAttribute call in
MessageElement. I specify the namespaceURI, localName, and value (as a
QName). It works at first. If I print out the SOAPEnvelope it adds the
namespace declaration properly and sets the type with the appropriate
prefix. However, if I print it out again, the prefix remains, but the
namespace declaration is gone. Even if I don't print it out again, it is
gone when I invoke the operation.
Has anyone used MessageElements extensively and have any advice on adding
attributes? I am wondering if this is a bug or if I am doing something
wrong. Given that it seems to work at first, makes me think there is a
small bug.
These two methods are very useful as they let me use QName and I don't need
to map namespaces. Is there another option for a workaround? Or should I
just add the namespaces manually. Is there a way to generate a unique
namespace?
I have included two SOAPEnvelopes...the first is what I wish to get and what
I get when I print out the message the first time while using addAttribute.
The second message is what I get when I print the SOAPEnvelope the second
time.
Thanks,
Chris Williamson
What it should look like...
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
\
xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:AuthorSearchRequest xmlns:ns1="urn:PI/DevCentral/SoapService">
<AuthorSearchRequest xsi:type="ns1:AuthorRequest">
<author xsi:type="ns2:string" \
xmlns:ns2="http://www.w3.org/1999/XMLSchema">Stephen Wolfram</author>
<page xsi:type="ns3:string" \
xmlns:ns3="http://www.w3.org/1999/XMLSchema">1</page>
<mode xsi:type="ns4:string" \
xmlns:ns4="http://www.w3.org/1999/XMLSchema">books</mode>
<tag xsi:type="ns5:string" \
xmlns:ns5="http://www.w3.org/1999/XMLSchema">webservices-20</tag>
<type xsi:type="ns6:string" \
xmlns:ns6="http://www.w3.org/1999/XMLSchema">lite</type>
<devtag xsi:type="ns7:string" \
xmlns:ns7="http://www.w3.org/1999/XMLSchema">D3VZJS46JD5U9D</devtag>
<version xsi:type="ns8:string" \
xmlns:ns8="http://www.w3.org/1999/XMLSchema">1.0</version>
</AuthorSearchRequest>
</ns1:AuthorSearchRequest>
</soapenv:Body>
</soapenv:Envelope>
What I get the second time...
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
\
xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:AuthorSearchRequest xmlns:ns1="urn:PI/DevCentral/SoapService">
<AuthorSearchRequest xsi:type="ns1:AuthorRequest">
<author xsi:type="ns2:string">Stephen Wolfram</author>
<page xsi:type="ns3:string">1</page>
<mode xsi:type="ns4:string">books</mode>
<tag xsi:type="ns5:string">webservices-20</tag>
<type xsi:type="ns6:string">lite</type>
<devtag xsi:type="ns7:string">D3VZJS46JD5U9D</devtag>
<version xsi:type="ns8:string">1.0</version>
</AuthorSearchRequest>
</ns1:AuthorSearchRequest>
</soapenv:Body>
</soapenv:Envelope>