msxml удаляет разрывы строк в разделе CDATA - PullRequest
4 голосов
/ 19 февраля 2009

У меня есть простой 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, учитывая разрывы строк?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2009

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

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

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

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

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

Приветствия

0 голосов
/ 21 февраля 2009

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

...