msxml удаляет разрывы строк в разделе CDATA

У меня есть простой XML с разделом CDATA, например:

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

И у меня есть текущий код для разбора раздела CDATA с использованием MSXML.

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();

Но ни один из a, b, c или d не сохраняет разрывы строк, которые есть в XML. И это вывод:

lineanother lineand another

Когда я создаю документ, я устанавливаю флаг сохранения пробелов:

m_pXmlDoc->put_preserveWhiteSpace(VARIANT_TRUE);

Есть ли у вас какие-либо идеи о том, как я могу получить значение раздела CDATA с учетом разрывов строк?


person Jorge Ferreira    schedule 19.02.2009    source источник


Ответы (2)


Я не думаю, что CDATA должен сохранять пробелы. Обычно используется для экранирования таких символов, как ‹ или >. http://www.javacommerce.com/displaypage.jsp?name=whitespa.sql&id=18238 это может помочь.

person Tarski    schedule 20.02.2009

Почему бы что-то вроде Base64 не закодировать данные перед тем, как сохранить их в XML-документе? Тогда вам даже не нужен тег CDATA. Просто Base 64 декодирует значение, когда вы его извлекаете, и все исходные данные будут сохранены.

У этого решения есть два минуса:

  1. Сохраняемые данные будут немного больше (как базовые 64 байта).
  2. Вы, очевидно, потеряете читаемость обычного текста в файле XML (поскольку он будет закодирован в Base 64)

Конечно, положительное: не нужно беспокоиться о проблемах с CDATA, которые, надеюсь, перевесят недостатки в вашей ситуации.

url encode, html encode и добавление косой черты — все это альтернативы, которые потребуют дополнительной работы для реализации, но сохранят некоторую читабельность, а также меньшие размеры.

Ваше здоровье

person Andy    schedule 21.02.2009