2009-02-19 1 views
4

У меня есть простой XML с секцией CDATA как:MSXML удаляет разрывы строк в секции 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 с учетом линия ломается?

ответ

1

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

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

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

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

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

Cheers