CDATA节点在打印到流或文件时被Rapidxml破坏

时间:2018-08-29 12:30:06

标签: c++ rapidxml

我正在研究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中的错误。

0 个答案:

没有答案