Russian Qt Forum

Qt => XML => Тема начата: max1983 от Июль 20, 2009, 19:15



Название: XML Сериализация.
Отправлено: max1983 от Июль 20, 2009, 19:15
Есть предположим XML файл и его надо Десериализовать.
То есть прочитать и заснуть в класс.

В VS есть утилита xsd которая гененрила файл .h в котором и описывалось схема xml
и примерно таким способом можно получить данные:
Цитировать
XmlSerializer ^ Ser = gcnew XmlSerializer(GetType());
MyType ^ Value =  dynamic_cast<MyType ^>(Ser ->Deserialize(XMLREADER));

А как средствами QT можно сделать похожее?


Название: Re: XML Сериализация.
Отправлено: break от Июль 21, 2009, 00:29
Из приведенного фрагмента кода я ничего не понял.
Но если предположить что у вас в Xml описание какие экземпляры каких классов надо создать - то читать Xml через QtXml и сделать оставшуюся работу.
DOM - изначально не сериализованные данные - т.е. Xml читается целиком с поддержкой всех вложенных структур и т.д. То есть десириализовывать ничего не нужно - оно и так в объектном виде. Нужно только создать нужные классы.


Название: Re: XML Сериализация.
Отправлено: max1983 от Июль 21, 2009, 08:43
Цитировать
Из приведенного фрагмента кода я ничего не понял.
Я сам иногда не понимаю что пишу  ;)
Просто в QT обнаружил аналогичный класс QXmlSerializer
Логично предположил что он делает тоже самое.
Только примеров не нашел, и зачем он так и не понял.

Вот тут есть маленький пример цель которого я так и не понял
http://doc.trolltech.com/main-snapshot/qxmlquery.html

Цитировать
Но если предположить что у вас в Xml описание какие экземпляры каких классов надо создать - то читать Xml через QtXml и сделать оставшуюся работу.
DOM - изначально не сериализованные данные - т.е. Xml читается целиком с поддержкой всех вложенных структур и т.д. То есть десириализовывать ничего не нужно - оно и так в объектном виде. Нужно только создать нужные классы.

Я так понимаю вы мне предлагаете - циклом заполнять свои классы?
Эта идея не нова.  :-\

Десериализовать - подразумевалось заполнить данными свой класс из прочитанного XML;


Название: Re: XML Сериализация.
Отправлено: BigZ от Июль 21, 2009, 08:48
Есть предположим XML файл и его надо Десериализовать.
То есть прочитать и заснуть в класс.

В VS есть утилита xsd которая гененрила файл .h в котором и описывалось схема xml
и примерно таким способом можно получить данные:
Цитировать
XmlSerializer ^ Ser = gcnew XmlSerializer(GetType());
MyType ^ Value =  dynamic_cast<MyType ^>(Ser ->Deserialize(XMLREADER));

А как средствами QT можно сделать похожее?


Какой тип нужно сериализовать/десериализовать?


Название: Re: XML Сериализация.
Отправлено: max1983 от Июль 21, 2009, 09:18
Цитировать
Какой тип нужно сериализовать/десериализовать?

Код:
 
<MicroBetActivLine>
  <GAME>
    <ID>1427</ID>
    <SportID>4</SportID>
    <TitleID>98</TitleID>
    <NameOneID>654</NameOneID>
    <NameTwoID>655</NameTwoID>
    <DtataStart>2009-06-23T13:00:00+03:00</DtataStart>
    <SportName>Tennis</SportName>
    <NameTitle>Women. WIMBLEDON.</NameTitle>
    <NameOne>Ivanovic</NameOne>
    <NameTwo>Hradecka</NameTwo>
    <SummMax>100</SummMax>
    <SummMin>1</SummMin>
    <Total_under>19.0</Total_under>
    <under>1.96</under>
    <Total_over>19.0</Total_over>
    </GAME>
 </MicroBetActivLine>

Как видеш компания разношёрстная
И String и дата и Double
ну эт ток кусок в середине много еще елементов


Название: Re: XML Сериализация.
Отправлено: BigZ от Июль 21, 2009, 10:15
В Qt не видно прямой поддержки серелизации/десерелизаци. Для простых типов вроде не сложно сделать. У вас там простые типы. Для сложных UI типов, наследников QWidget, можно попробовать посмотреть QAbstractFormBuilder.


Название: Re: XML Сериализация.
Отправлено: max1983 от Июль 21, 2009, 15:10
Для простых типов вроде не сложно сделать. У вас там простые типы.
Все верно.
Только у меня много этих простых типов. То есть много разных XML c простыми типами.
И под каждый XML делать цикл надо.
Цитировать
В Qt не видно прямой поддержки серелизации/десерелизаци.
А может кто знает стороннию либу под C++?  ???


Название: Re: XML Сериализация.
Отправлено: BigZ от Июль 21, 2009, 16:49
Для простых типов вроде не сложно сделать. У вас там простые типы.
Все верно.
Только у меня много этих простых типов. То есть много разных XML c простыми типами.
И под каждый XML делать цикл надо.
Чтобы получить более-менее универсальный механизм, нужно чтобы ваш объект MicroBetActivLine был наследником QObject и имел метаинформацию на свойства, которые есть в XML. Тогда в теории можно бежать
по XML и пользуясь метаинформацией выставлять попутно соответствующим свойствам значения из XML.   


class MicroBetActivLine: public QObject
Q_OBJECT
public:
Q_PROPERTY(ID, ...)
Q_PROPERTY(SportID, ...)
Q_PROPERTY(TitleID, ...)
...
};


Название: Re: XML Сериализация.
Отправлено: Rcus от Июль 21, 2009, 16:58
Если есть какая-то общая задача, то первым делом надо смотреть в буст :) http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html (там же есть ссылки и на другие библиотеки для сериализации)


Название: Re: XML Сериализация.
Отправлено: TESTER от Сентябрь 16, 2009, 16:42
А может кто знает стороннию либу под C++?  ???
Поиск по SF:
[(Lib) + XML]: http://sourceforge.net/search/index.php?words=%28%2BLib%29+AND+trove%3A%28559%29
[(QT) + XML]: http://sourceforge.net/search/index.php?words=%28%2BQT%29+AND+trove%3A%28559%29
[(C++) + XML]: http://sourceforge.net/search/index.php?words=%28%2BC%2B%2B%29+AND+trove%3A%28559%29