msxml删除CDATA部分中的换行符

时间:2009-02-19 17:45:41

标签: c++ xml parsing msxml

我有一个简单的XML,其CDATA部分如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<config>
    <input>
    <![CDATA[
line
another line
and another
    ]]>
    </input>
    ...
</config>

我有使用MSXML解析CDATA部分的当前代码。

for (int i = 0, count = pChildNodes->Getlength(); i < count; ++i) {
    IXMLDOMNodePtr pNode = pChildNodes->Getitem(i);
    if (pNode->GetnodeType() != NODE_COMMENT && pNode->GetnodeType() != NODE_TEXT) {
        if (pNode->GetnodeType() == NODE_CDATA_SECTION) {
            IXMLDOMCDATASectionPtr pCData = pNode;
            _bstr_t a = pCData->Getdata();
            _variant_t b = pCData->GetnodeValue();
            _bstr_t c = pCData->Gettext();
            _bstr_t d = pCData->Getxml();

abcd都没有保留XML中的换行符。这是输出:

lineanother lineand another

当我创建文档时,我设置了保留空格标志:

m_pXmlDoc->put_preserveWhiteSpace(VARIANT_TRUE);

关于如何考虑换行符,我对如何获得CDATA部分的价值有什么想法?

2 个答案:

答案 0 :(得分:0)

我认为CDATA不应该保留空白。它通常用于转义诸如&lt;之类的字符。或者&gt;。 http://www.javacommerce.com/displaypage.jsp?name=whitespa.sql&id=18238这可能会有所帮助。

答案 1 :(得分:0)

为什么像Base64这样的东西在将数据存储到XML文档之前不对其进行编码?那你甚至不需要CDATA标签。只需Base 64在检索时解码该值,原始数据将全部保留。

此解决方案有两个不利因素:

  1. 存储的数据会略大(以Base 64字节为单位)
  2. 您显然会丢失XML文件中的纯文本可读性(因为它将是Base 64编码的)
  3. 当然,积极的:不需要担心CDATA问题,这有望超过你的情况的负面因素。

    url encode,html编码和添加斜杠都是需要额外工作才能实现的替代方案,但保留一些可读性以及更小的尺寸。

    干杯

相关问题