如何在SOAP消息中发送XML

时间:2014-11-04 09:57:48

标签: xml soap gsoap

我试图引导同事走向在SOAP消息中发送XML文档的最正确方式,但我并不是这方面的专家。看起来似乎应该可以使用CDATA部分解决,但默认的gSOAP序列化器是“帮助”#39;通过编码所有'<'和'>'。

例如,当我们尝试发送时:

<xml>
    <tag>
        <content>
            <![CDATA[<xml><tag>Text!</tag></xml>]]>
        </content>
    </tag>
</xml>

实际发送的内容更像是:

<xml>
    <tag>
        <content>
            &lt;![CDATA[&lt;xml&gt;&lt;tag&gt;Text!&lt;/tag&gt;&lt;/xml&gt;]]&gt;
        </content>
    </tag>
</xml>

如果接收器也是基于gSOAP的,我们可以透明地避开它,甚至不需要CDATA标记,但事实并非如此。接收器是一些PHP代码,所以使用html_entity_decode可能有效,但感觉不对(并且可能在所有情况下都不起作用?)。

我希望/期望解决方案是为字段指定不同的类型(当前&#39; xsd:string&#39;)以便使用dumber序列化程序,保留CDATA标记和其中的内容。

如果有一个简单而正确的解决方法(建议使用base64编码有效载荷),我想避免任何内部轮重新发明。

2 个答案:

答案 0 :(得分:0)

序列化程序可能会将您的输入作为文本而不是XML ...所以只需将CDATA标记保留在文本之外,并让它使用字符引用而不是CDATA标记。<​​/ p>

答案 1 :(得分:0)

我绝对建议反对使用CDATA来包装您的数据,即使它似乎是最方便的解决方案。

主要原因是CDATA应该表示字符数据,因为您的内容元素基本上是嵌套的XML(即数据),从技术上讲,它在这里使用是不正确的。

在这种情况下我会提出两种解决方案:

  1. 将内容元素的类型重新定义为复杂元素(可能会变得混乱,特别是如果您希望内容元素支持不同的模式)。
  2. 对内容值进行编码(Base64或HTML实体,具体取决于您的要求)。
  3. 我意识到这可能不是你想要听到的,但是在实际理解其预期用途(https://www.w3.org/TR/REC-xml/#sec-cdata-sect)之前,我曾经处于相同的位置并且摸索着CDATA,我觉得以上两种选择是最佳方式。