다른 XML을 포함하는 CDATA 섹션이있는 SOAP 메시지를 보내려고하는데 구문 분석 오류가 발생합니다. XML 데이터를 CDATA 섹션에 포함해야합니다.
아래에 내 코드가 있습니다.
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();
}
}
}
"RECPortStub"클래스의 코드는 다음과 같습니다.
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;
}
}
}
참고 : 내 질문의 xml은 형식이 좋지 않지만 Axis 가 '<', '>'문자 (이스케이프 코드)를 변경하여 '<'및 '>'와 같은 문자를 이스케이프 하는 경우 테스트하는 데 사용합니다 . XML의 CDATA 섹션 .
두 가지 해결책이 있습니다.
(쉬운 해결책) SOAP 처리를 위해 Axis 대신 SAAJ 를 사용하십시오 . SAAJ 는 CDATA 섹션 내의 문자를 이스케이프하지 않습니다.
XML의 CDATA 섹션 내에서 문자가 이스케이프 문자 대신있는 그대로 전달되도록 Axis 메서드를 재정의합니다. CDATA 섹션 외부에서는 XML 문서로 인해보다 작거나 큰 문자를 이스케이프해야하지만 CDATA 섹션 내부에서는 그대로 전달해야합니다 (내가 아는 한).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다