【问题标题】:Parse error when embedding XML into the CDATA section in a SOAP Request将 XML 嵌入 SOAP 请求的 CDATA 部分时出现解析错误
【发布时间】:2014-02-22 03:50:24
【问题描述】:

我正在尝试发送一个包含另一个 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;
        }
    }

}

【问题讨论】:

  • 显示完整的堆栈跟踪
  • 能否展示一下RECPortStub的代码?
  • 在 SOAP 消息的哪个部分插入 CDATA 部分?
  • @helderdarocha : 我刚刚添加了 RECPortStub 的代码
  • 这不是你的完整代码,是吗?主类甚至不会编译。 userNameuserData 是什么?该 XML 片段也不能是您的整个消息(CDATA 部分不是格式良好的 XML 文档)。 Soap 消息还具有您的框架可能提供的特定结构,但这里并不清楚。在main() 中显示您正在使用的完整代码,不要省略任何内容。信息。

标签: java xml soap escaping character


【解决方案1】:

注意:我的问题中的 xml 格式不正确,但是我只是用它来测试是否 Axis 将 '' 字符(转义码)更改为转义字符像 XML 的 CDATA 部分 中的 ''。

有两种解决方案;

  1. (简单的解决方案)使用 SAAJ 而不是 Axis 进行 SOAP 处理。 SAAJ 不会转义 CDATA 部分中的字符。

  2. 重写 Axis 方法,以便在 XML 的 CDATA 部分中,按原样传递字符而不是转义字符。在 CDATA 部分之外,由于 xml 文档,应该对小于或大于之类的字符进行转义,但是在 CDATA 部分中,它们应该按原样传递(据我所知)。

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2019-08-08
    • 2018-10-20
    相关资源
    最近更新 更多