You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@xmlbeans.apache.org by Mohan Radhakrishnan <ra...@gmail.com> on 2008/06/03 12:09:17 UTC

Document literal style - Send XML as string

Hi,
    There is lot of code in this mail. Hope I am asking the right question.

    I am using the doc/lit style to send a xs:string type. Now if I post an
entire XML then it gets wrapped in CDATA. I am using Axis 2 XMLBeans
bindings. The WSDL is pasted at the end.

The SOAP message is

<?xml version=...............?>
<soapenv:Envelope xmlns:soapenv="http:
//schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body><something:test
xmlns:
something="http://test.com">
<something:arg0><![CDATA[<Request
xsi:
noNamespaceSchemaLocation="Test1.0.4.xsd"
xmlns:xsi="http://www.w3.
org/2001/XMLSchemainstance">
  <Header>
..........
.........
</soapenv:Envelope>


when I use this code.

stub =
                                new TestServiceStub( SECURE_WEB_SERVICE );
            document =
            TestDocument.Factory.newInstance();

            File file = new File("Request.xml" );

                        Request request =
                                Request.
                                 Factory.
                                  parse( getXml( file ) ); //Set XML as
string

        test = document.addNewTest();
                test.setArg0( request.toString() );
        document.setTest( test ); 



In the code shown above if I replaced

                        setArg0( request.toString() );

with
                        set( getXmlObject() ); //XMLBeans API

I get my XML as a child like this.

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<someprefix:test xmlns:rul="http://test.com">
<Request xsi:noNamespaceSchemaLocation="Test.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
....................
</soapenv:Envelope>

but

the error is "Unexpected subelement".

1. Which of these two styles is correct according to the WSDL.
2. How is "someprefix" getting generated. It does not match anything in my
WSDL. 

   (E.G) <someprefix:test xmlns:rul="http://test.com">


Thanks,
Mohan


<?xml version='1.0' encoding='UTF-8'?>
<s0:definitions name="TestServiceDefinitions"
targetNamespace="http://test.com" xmlns=""   
xmlns:s0="http://schemas.xmlsoap.org/wsdl/"
                xmlns:s1="http://test.com"
                xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/" >



  <s0:types>
    <xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" targetNamespace="http://test.com"
xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:s1="http://test.com"
xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="test">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="arg0" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="testResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="return" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </s0:types>
  <s0:message name="test">
    <s0:part element="s1:test" name="parameters"/>
  </s0:message>
  <s0:message name="testResponse">
    <s0:part element="s1:testResponse" name="parameters"/>
  </s0:message>
  <s0:portType name="TestPortType">
    <s0:operation name="test" parameterOrder="parameters">
      <s0:input message="s1:test"/>
      <s0:output message="s1:testResponse"/>
    </s0:operation>
  </s0:portType>
  <s0:binding name="TestServiceSoapBinding" type="s1:TestPortType">
    <s2:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
    <s0:operation name="test">
      <s2:operation soapAction="http://test.com/test" style="document"/>
      <s0:input>
        <s2:body parts="parameters" use="literal"/>
      </s0:input>
      <s0:output>
        <s2:body parts="parameters" use="literal"/>
      </s0:output>
    </s0:operation>
  </s0:binding>
  <s0:service name="TestService">
    <s0:port binding="s1:TestServiceSoapBinding" name="TestPort">
      <s2:address
location="http://localhost:8081/axis2/services/TestService"/>
    </s0:port>
  </s0:service>
</s0:definitions>
-- 
View this message in context: http://www.nabble.com/Document-literal-style---Send-XML-as-string-tp17620196p17620196.html
Sent from the Xml Beans - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org


RE: Document literal style - Send XML as string

Posted by Mohan Radhakrishnan <ra...@gmail.com>.
Thanks. I will do that.

How is this style of sending XML as String related to the multi-refs created
by Axis( Is it before version 2 ? )

XML just seems too confusing with all there various styles. I have an
example of rpc encoding WSDL that cause Axis to generate multi-refs to send
XML as String.

Mohan
-- 
View this message in context: http://www.nabble.com/Document-literal-style---Send-XML-as-string-tp17620196p17647006.html
Sent from the Xml Beans - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org


RE: Document literal style - Send XML as string

Posted by "Vinh Nguyen (vinguye2)" <vi...@cisco.com>.
Hi Mohan,
(I'm copying the axis-user since I noticed you also posted this question
there, too.)

The problem seems to be with your code.  Keep these in mind:

1) arg0 is a string type.
2) Since you are placing an XML-formatted string in arg0, the string
must be XML-escaped.  Don't put raw XML in arg0.
3) The xmlObject.set(obj) method is meant only to take in the same type
of object (or a subclass of that object) that you are calling the set()
on.  It just copies over the value of the input object.  So you can do
objectA.set(otherObjectA), but should not do objectA.set(objectB).
4) Don't do:
       test.setArg0(request.toString());  // This is probably why you're
getting CDATA.
   And don't do:
       test.set(request);  // request and test are not the same types

   Instead, you need to do:
       String escapedVal = ... // Convert request to an XML string, and
then XML-escape it.
       test.setArg0(escapedVal);

On the server side, your code will need to first take arg0 and
"unescape" the value before it can work with it as proper XML.  It
should not assume to get raw XML in arg0.

-Vinh



-----Original Message-----
From: Mohan Radhakrishnan [mailto:radhakrishnan.mohan@gmail.com] 
Sent: Tuesday, June 03, 2008 3:09 AM
To: user@xmlbeans.apache.org
Subject: Document literal style - Send XML as string


Hi,
    There is lot of code in this mail. Hope I am asking the right
question.

    I am using the doc/lit style to send a xs:string type. Now if I post
an entire XML then it gets wrapped in CDATA. I am using Axis 2 XMLBeans
bindings. The WSDL is pasted at the end.

The SOAP message is

<?xml version=...............?>
<soapenv:Envelope xmlns:soapenv="http:
//schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body><something:test
xmlns:
something="http://test.com">
<something:arg0><![CDATA[<Request
xsi:
noNamespaceSchemaLocation="Test1.0.4.xsd"
xmlns:xsi="http://www.w3.
org/2001/XMLSchemainstance">
  <Header>
..........
.........
</soapenv:Envelope>


when I use this code.

stub =
                                new TestServiceStub( SECURE_WEB_SERVICE
);
            document =
            TestDocument.Factory.newInstance();

            File file = new File("Request.xml" );

                        Request request =
                                Request.
                                 Factory.
                                  parse( getXml( file ) ); //Set XML as
string

        test = document.addNewTest();
                test.setArg0( request.toString() );
        document.setTest( test ); 



In the code shown above if I replaced

                        setArg0( request.toString() );

with
                        set( getXmlObject() ); //XMLBeans API

I get my XML as a child like this.

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<someprefix:test xmlns:rul="http://test.com"> <Request
xsi:noNamespaceSchemaLocation="Test.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
....................
</soapenv:Envelope>

but

the error is "Unexpected subelement".

1. Which of these two styles is correct according to the WSDL.
2. How is "someprefix" getting generated. It does not match anything in
my WSDL. 

   (E.G) <someprefix:test xmlns:rul="http://test.com">


Thanks,
Mohan


<?xml version='1.0' encoding='UTF-8'?>
<s0:definitions name="TestServiceDefinitions"
targetNamespace="http://test.com" xmlns=""   
xmlns:s0="http://schemas.xmlsoap.org/wsdl/"
                xmlns:s1="http://test.com"
                xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/" >



  <s0:types>
    <xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" targetNamespace="http://test.com"
xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:s1="http://test.com"
xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="test">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="arg0" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="testResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="return" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </s0:types>
  <s0:message name="test">
    <s0:part element="s1:test" name="parameters"/>
  </s0:message>
  <s0:message name="testResponse">
    <s0:part element="s1:testResponse" name="parameters"/>
  </s0:message>
  <s0:portType name="TestPortType">
    <s0:operation name="test" parameterOrder="parameters">
      <s0:input message="s1:test"/>
      <s0:output message="s1:testResponse"/>
    </s0:operation>
  </s0:portType>
  <s0:binding name="TestServiceSoapBinding" type="s1:TestPortType">
    <s2:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
    <s0:operation name="test">
      <s2:operation soapAction="http://test.com/test" style="document"/>
      <s0:input>
        <s2:body parts="parameters" use="literal"/>
      </s0:input>
      <s0:output>
        <s2:body parts="parameters" use="literal"/>
      </s0:output>
    </s0:operation>
  </s0:binding>
  <s0:service name="TestService">
    <s0:port binding="s1:TestServiceSoapBinding" name="TestPort">
      <s2:address
location="http://localhost:8081/axis2/services/TestService"/>
    </s0:port>
  </s0:service>
</s0:definitions>
--
View this message in context:
http://www.nabble.com/Document-literal-style---Send-XML-as-string-tp1762
0196p17620196.html
Sent from the Xml Beans - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org


RE: Document literal style - Send XML as string

Posted by "Vinh Nguyen (vinguye2)" <vi...@cisco.com>.
Hi Mohan,
(I'm copying the axis-user since I noticed you also posted this question
there, too.)

The problem seems to be with your code.  Keep these in mind:

1) arg0 is a string type.
2) Since you are placing an XML-formatted string in arg0, the string
must be XML-escaped.  Don't put raw XML in arg0.
3) The xmlObject.set(obj) method is meant only to take in the same type
of object (or a subclass of that object) that you are calling the set()
on.  It just copies over the value of the input object.  So you can do
objectA.set(otherObjectA), but should not do objectA.set(objectB).
4) Don't do:
       test.setArg0(request.toString());  // This is probably why you're
getting CDATA.
   And don't do:
       test.set(request);  // request and test are not the same types

   Instead, you need to do:
       String escapedVal = ... // Convert request to an XML string, and
then XML-escape it.
       test.setArg0(escapedVal);

On the server side, your code will need to first take arg0 and
"unescape" the value before it can work with it as proper XML.  It
should not assume to get raw XML in arg0.

-Vinh



-----Original Message-----
From: Mohan Radhakrishnan [mailto:radhakrishnan.mohan@gmail.com] 
Sent: Tuesday, June 03, 2008 3:09 AM
To: user@xmlbeans.apache.org
Subject: Document literal style - Send XML as string


Hi,
    There is lot of code in this mail. Hope I am asking the right
question.

    I am using the doc/lit style to send a xs:string type. Now if I post
an entire XML then it gets wrapped in CDATA. I am using Axis 2 XMLBeans
bindings. The WSDL is pasted at the end.

The SOAP message is

<?xml version=...............?>
<soapenv:Envelope xmlns:soapenv="http:
//schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body><something:test
xmlns:
something="http://test.com">
<something:arg0><![CDATA[<Request
xsi:
noNamespaceSchemaLocation="Test1.0.4.xsd"
xmlns:xsi="http://www.w3.
org/2001/XMLSchemainstance">
  <Header>
..........
.........
</soapenv:Envelope>


when I use this code.

stub =
                                new TestServiceStub( SECURE_WEB_SERVICE
);
            document =
            TestDocument.Factory.newInstance();

            File file = new File("Request.xml" );

                        Request request =
                                Request.
                                 Factory.
                                  parse( getXml( file ) ); //Set XML as
string

        test = document.addNewTest();
                test.setArg0( request.toString() );
        document.setTest( test ); 



In the code shown above if I replaced

                        setArg0( request.toString() );

with
                        set( getXmlObject() ); //XMLBeans API

I get my XML as a child like this.

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<someprefix:test xmlns:rul="http://test.com"> <Request
xsi:noNamespaceSchemaLocation="Test.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
....................
</soapenv:Envelope>

but

the error is "Unexpected subelement".

1. Which of these two styles is correct according to the WSDL.
2. How is "someprefix" getting generated. It does not match anything in
my WSDL. 

   (E.G) <someprefix:test xmlns:rul="http://test.com">


Thanks,
Mohan


<?xml version='1.0' encoding='UTF-8'?>
<s0:definitions name="TestServiceDefinitions"
targetNamespace="http://test.com" xmlns=""   
xmlns:s0="http://schemas.xmlsoap.org/wsdl/"
                xmlns:s1="http://test.com"
                xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/" >



  <s0:types>
    <xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" targetNamespace="http://test.com"
xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:s1="http://test.com"
xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="test">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="arg0" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="testResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="return" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </s0:types>
  <s0:message name="test">
    <s0:part element="s1:test" name="parameters"/>
  </s0:message>
  <s0:message name="testResponse">
    <s0:part element="s1:testResponse" name="parameters"/>
  </s0:message>
  <s0:portType name="TestPortType">
    <s0:operation name="test" parameterOrder="parameters">
      <s0:input message="s1:test"/>
      <s0:output message="s1:testResponse"/>
    </s0:operation>
  </s0:portType>
  <s0:binding name="TestServiceSoapBinding" type="s1:TestPortType">
    <s2:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
    <s0:operation name="test">
      <s2:operation soapAction="http://test.com/test" style="document"/>
      <s0:input>
        <s2:body parts="parameters" use="literal"/>
      </s0:input>
      <s0:output>
        <s2:body parts="parameters" use="literal"/>
      </s0:output>
    </s0:operation>
  </s0:binding>
  <s0:service name="TestService">
    <s0:port binding="s1:TestServiceSoapBinding" name="TestPort">
      <s2:address
location="http://localhost:8081/axis2/services/TestService"/>
    </s0:port>
  </s0:service>
</s0:definitions>
--
View this message in context:
http://www.nabble.com/Document-literal-style---Send-XML-as-string-tp1762
0196p17620196.html
Sent from the Xml Beans - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org