Russian Qt Forum

Qt => XML => Тема начата: sLiva от Февраль 07, 2008, 21:36



Название: Проблема при сохранении QDomDocument в файл
Отправлено: 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); Все нормально

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




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

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

Если у кого есть другое решение, очень интересно...


Название: Re: Проблема при сохранении QDomDocument в файл
Отправлено: Вячеслав от Февраль 28, 2008, 11:38
А ради интереса QIODevice::Text выкинуть нафиг ?


Название: Re: Проблема при сохранении QDomDocument в файл
Отправлено: sLiva от Февраль 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. Ну пока решение котрое я привел работает, незнаю что это баг, или специфика работы :-)


Название: Re: Проблема при сохранении QDomDocument в файл
Отправлено: ритт от Февраль 29, 2008, 22:20
если всё так, как ты описал, то баг, т.к. по спецификации содержимое цдата не должно модифицироваться при обработке дерева

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


Название: Re: Проблема при сохранении QDomDocument в файл
Отправлено: sLiva от Март 01, 2008, 00:26
если всё так, как ты описал, то баг, т.к. по спецификации содержимое цдата не должно модифицироваться при обработке дерева

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

Кстати я не указал версию - 4.3.0, может в посвежее версиях и нет такой проблемы, а проверить нет возможности, использую "некупленую" :-) версию под VS2005 а найти более свежую проблематично :-)


Название: Re: Проблема при сохранении QDomDocument в файл
Отправлено: Tonal от Март 02, 2008, 14:19
Начиная с 4.3.2 версия OpenSource нормально работаетс VS - так что бери любую. :-)