我正在研究SOAP接口实现,该实现要求我将XML作为CDATA添加到SOAP请求中。我的实现是用C ++进行的,并且在我的库集中,我有一个rapidxml的包装器实现,这使其对OO更加友好(我没有编写此包装器或库的特定部分)。
我在单独的XML文档实例中构造了彼此分离的SOAP请求XML和内部XML结构。构建完内部XML结构后,我将其转换为字符串并将其作为CDATA节点添加到SOAP请求中。
问题是,当我打印通过转换内部XML文档产生的字符串时,我得到了一个非常好的字符串。当我将该字符串作为CDATA添加到SOAP请求中并将其转换为字符串时,CDATA字段将被修饰。
说我有如下内部XML结构字符串:
<Events>
<Event>
<ID>29081812</SaeID>
<TerminalID>41</TerminalID>
<EventType>A</EventType>
<ObjectNumber>15</ObjectNumber>
<EventCode>=</EventCode>
<EventSubCode>g</EventSubCode>
<TimeStart>2018-08-27T11:29:27.386407+02:00</TimeStart>
</Event>
</Events>
将其添加到SOAP请求中,并将其转换为字符串后,结果如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SendEventsFromTetra xmlns="some-namespace">
<events>
<![CDATA[<Events>
<Event>
<ID>29▒C
Q▒]
▒]
▒▒/▒▒/nTerminalID>
<EventType>A</EventType>
<ObjectNumber>15</ObjectNumber>
<EventCode>=</EventCode>
<EventSubCode>g</EventSubCode>
<TimeStart>2018-08-27T11:29:27.386407+02:00</TimeStart>
</Event>
</Events>
]]>
</events>
</SendEventsFromTetra>
</soap:Body>
</soap:Envelope>
其他信息:
注释1: CDATA字段被篡改的点并不总是在同一位置。通常,它已经在CDATA节点声明之后的开始<Events>
元素上进行了修饰。
注2::使用Rapidxml :: print函数将XML结构转换为字符串,该函数将XML结构添加到字符串缓冲区,然后以字符串形式返回:
void XmlBuilder::Save(std::ostream& out, XmlFormat format) const
{
rapidxml::print(out, doc_, format == XmlFormat::Compact ? rapidxml::print_no_indenting : 0);
}
注意3:有时它会变得很糟:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SendEventsFromTetra xmlns="some-namespace">
<events>
<![CDATA[<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SendEventsFromTetra xmlns="some-namespace">
<events>
<![CDATA[<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SendEventsFromTetra xmlns="some-namespace">
<events>
<![CDATA[<soap:Envelope xmlns:soap="http://schema]]>
</events>
</SendEventsFromTetra>
</soap:Body>
</soap:Envelope>
我不知道我做错了什么,还是只是Rapidxml中的错误。