Russian Qt Forum
Сентябрь 21, 2024, 11:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема при сохранении QDomDocument в файл  (Прочитано 8324 раз)
sLiva
Гость
« : Февраль 07, 2008, 21:36 »

Читаю следующий XML файл:

<?xml version="1.0" encoding="utf-8"?>
<test>
    <tag1>
        Test
        Test
    </tag1>
    <tag2>Test</tag2>
    <tag3>Test</tag3>
    <tag4>Test</tag4>
    <tag5>
        <![CDATA[
            <body>
                <table>
                   <tr>
                      <td></td>
                   </tr>
                </table>
            </body>
        ]]>
    </tag5>
</test>

Читаю стандартным образом:

   QDomDocument doc;
   QFile fileIn("test_in.xml");
   if (!fileIn.open(QIODevice::ReadOnly | QIODevice::Text))
      return;
   if (!doc.setContent(&fileIn)){
      fileIn.close();
      return;
   }

Затем просто сохраняю этот QDomDocument в другой файл, тоже стандартным образом:

   QFile fileOut("test_out.xml");
   if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
      return;

   QTextStream out(&fileOut);
   out.setCodec("UTF-8");
   doc.save(out, 4);

На выходе получается вот такой файл:

<?xml version='1.0' encoding='utf-8'?>
<test>
    <tag1>&#xd;
        Test &#xd;
        Test&#xd;
    </tag1>
    <tag2>Test</tag2>
    <tag3>Test</tag3>
    <tag4>Test</tag4>
    <tag5><![CDATA[

            <body>

                <table>

                   <tr>

                      <td></td>

                   </tr>

                </table>

            </body>

        ]]></tag5>
</test>

В разделе CDATA появились лишние строки, в <tag1> появились &#xd;
Еще и vs2005 ругается что типа файл имеет некорректные строковые разделители, и предлагает восстановить.

Дебагом смотрел содержимое doc.toString(4); Все нормально

Кто откликнется заранее спасибо :-))




------
Если кому интересно, то проблема решена следующим образом:

подсовывать дом документу не ссылку на файл а предварительно прочитать файл в КуСтринг, а затем уже только скармливать его дом документу.

Если у кого есть другое решение, очень интересно...
« Последнее редактирование: Февраль 14, 2008, 22:59 от sLiva » Записан
Вячеслав
Гость
« Ответ #1 : Февраль 28, 2008, 11:38 »

А ради интереса QIODevice::Text выкинуть нафиг ?
Записан
sLiva
Гость
« Ответ #2 : Февраль 29, 2008, 21:40 »

А ради интереса QIODevice::Text выкинуть нафиг ?

Конечно же пробовал, ситуация такая, QIODevice::Text как грит асистент, при чтении заменяет переводы строки на \n а при записи заменяет \n на перевод строки под конкретную систему. Так вот если в XML не у одного тега содержащего CDATA нет то и с ним и без него никаких проблем нет, нО если раздел CDATA есть то поведение следующее:
Когда указан QIODevice::Text появляются в CDATA пустые строки остальной XML нормальный
Когда не указан то с CDATA все нормально а вот у остального XML переводы строки вообще отсутствуют. Вот такая вот дребедень :-))) а вообще при дебаге обратил внимание что при чтении XML в строку в разделе CDATA всеравно появляются \n\n мне кажется что при чтении переводы строки в ней считаются частью раздела, а потом еще и добавляется штатный перевод строки вот от куда и появляются два \n\n. Ну пока решение котрое я привел работает, незнаю что это баг, или специфика работы :-)
Записан
ритт
Гость
« Ответ #3 : Февраль 29, 2008, 22:20 »

если всё так, как ты описал, то баг, т.к. по спецификации содержимое цдата не должно модифицироваться при обработке дерева

не поленись и отпишись троллям с компилябельным примером (мне, например, лень даже проверять Улыбающийся )
Записан
sLiva
Гость
« Ответ #4 : Март 01, 2008, 00:26 »

если всё так, как ты описал, то баг, т.к. по спецификации содержимое цдата не должно модифицироваться при обработке дерева

не поленись и отпишись троллям с компилябельным примером (мне, например, лень даже проверять Улыбающийся )

Кстати я не указал версию - 4.3.0, может в посвежее версиях и нет такой проблемы, а проверить нет возможности, использую "некупленую" :-) версию под VS2005 а найти более свежую проблематично :-)
Записан
Tonal
Гость
« Ответ #5 : Март 02, 2008, 14:19 »

Начиная с 4.3.2 версия OpenSource нормально работаетс VS - так что бери любую. :-)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 21.