Reputation: 11602
I'm trying to send a soap message that which has a CDATA section that includes another XML, but I'm getting parse error. I need to embed the XML data into the CDATA section.
here is my code down below;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.AxisFault;
import com.levo.rec.*;
public class REC
{
public static void main(String args[])
{
String mesaj =
"<![CDATA[ " +
" <REC_DATA xmlns=\"http://www.levo.com/REC\"> " +
" <RECheader RECID=\"\" REClabel=\"\"/> " +
" <RECattributes> " +
" <attribute name=\"USERNAME\" value=\"" + userName + "\"/> " +
" <attribute name=\"DATA\" value=\"" + userData + "\"/> " +
" </RECattributes> " +
" </REC_DATA> " +
"]]> " ;
try
{
y = new RECPortStub();
y.sendMsg(mesaj);
} catch (AxisFault e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
code of "RECPortStub" class is as follows;
public class RECPortStub extends org.apache.axis.client.Stub implements
com.levo.rec.RECPort
{
private java.util.Vector cachedSerClasses = new java.util.Vector();
private java.util.Vector cachedSerQNames = new java.util.Vector();
private java.util.Vector cachedSerFactories = new java.util.Vector();
private java.util.Vector cachedDeserFactories = new java.util.Vector();
static org.apache.axis.description.OperationDesc[] _operations;
static
{
_operations = new org.apache.axis.description.OperationDesc[1];
_initOperationDesc1();
}
private static void _initOperationDesc1()
{
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName("sendMsg");
param = new org.apache.axis.description.ParameterDesc(
new javax.xml.namespace.QName("", "inputXMLMessage"),
org.apache.axis.description.ParameterDesc.IN,
new javax.xml.namespace.QName(
"http://www.w3.org/2001/XMLSchema", "string"),
java.lang.String.class, false, false);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName(
"http://www.w3.org/2001/XMLSchema", "string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName("",
"outputXMLMessage"));
oper.setStyle(org.apache.axis.constants.Style.RPC);
oper.setUse(org.apache.axis.constants.Use.ENCODED);
_operations[0] = oper;
}
public RECPortStub() throws org.apache.axis.AxisFault
{
this(null);
}
public RECPortStub(java.net.URL endpointURL,
javax.xml.rpc.Service service) throws org.apache.axis.AxisFault
{
this(service);
super.cachedEndpoint = endpointURL;
}
public RECPortStub(javax.xml.rpc.Service service)
throws org.apache.axis.AxisFault
{
if (service == null)
{
super.service = new org.apache.axis.client.Service();
} else
{
super.service = service;
}
((org.apache.axis.client.Service) super.service)
.setTypeMappingVersion("1.2");
}
protected org.apache.axis.client.Call createCall()
throws java.rmi.RemoteException
{
try
{
org.apache.axis.client.Call _call = super._createCall();
if (super.maintainSessionSet)
{
_call.setMaintainSession(super.maintainSession);
}
if (super.cachedUsername != null)
{
_call.setUsername(super.cachedUsername);
}
if (super.cachedPassword != null)
{
_call.setPassword(super.cachedPassword);
}
if (super.cachedEndpoint != null)
{
_call.setTargetEndpointAddress(super.cachedEndpoint);
}
if (super.cachedTimeout != null)
{
_call.setTimeout(super.cachedTimeout);
}
if (super.cachedPortName != null)
{
_call.setPortName(super.cachedPortName);
}
java.util.Enumeration keys = super.cachedProperties.keys();
while (keys.hasMoreElements())
{
java.lang.String key = (java.lang.String) keys.nextElement();
_call.setProperty(key, super.cachedProperties.get(key));
}
return _call;
} catch (java.lang.Throwable _t)
{
throw new org.apache.axis.AxisFault(
"Failure trying to get the Call object", _t);
}
}
public java.lang.String sendMsg(java.lang.String inputXMLMessage)
throws java.rmi.RemoteException
{
if (super.cachedEndpoint == null)
{
throw new org.apache.axis.NoEndPointException();
}
org.apache.axis.client.Call _call = createCall();
_call.setOperation(_operations[0]);
_call.setUseSOAPAction(true);
_call.setSOAPActionURI("");
_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
_call.setOperationName(new javax.xml.namespace.QName(
"http://hedehodo.com/RECadapter",
"sendMsg"));
setRequestHeaders(_call);
setAttachments(_call);
try
{
java.lang.Object _resp = _call
.invoke(new java.lang.Object[] { inputXMLMessage });
if (_resp instanceof java.rmi.RemoteException)
{
throw (java.rmi.RemoteException) _resp;
} else
{
extractAttachments(_call);
try
{
return (java.lang.String) _resp;
} catch (java.lang.Exception _exception)
{
return (java.lang.String) org.apache.axis.utils.JavaUtils
.convert(_resp, java.lang.String.class);
}
}
} catch (org.apache.axis.AxisFault axisFaultException)
{
throw axisFaultException;
}
}
}
Upvotes: 1
Views: 2004
Reputation: 11602
Note: The xml in my question is not well-formed however, I just use it to test that if Axis changing the '<', '>' characters (escape codes) to escape characters like '<' and '>' inside the CDATA section of the XML.
There are two solutions;
(Easy solution) Use SAAJ instead of Axis for SOAP handling. SAAJ does not escape characters inside the CDATA section.
Override the Axis methods so that inside CDATA section of the XML, characters are passed as they are instead of escape characters. Outside the CDATA section, characters like less than or greater than should be escaped due to the xml documentation however inside the CDATA section, they should be passed as is (as far as I know).
Upvotes: 3