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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: XML Сериализация.  (Прочитано 11976 раз)
max1983
Гость
« : Июль 20, 2009, 19:15 »

Есть предположим XML файл и его надо Десериализовать.
То есть прочитать и заснуть в класс.

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

А как средствами QT можно сделать похожее?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Июль 21, 2009, 00:29 »

Из приведенного фрагмента кода я ничего не понял.
Но если предположить что у вас в Xml описание какие экземпляры каких классов надо создать - то читать Xml через QtXml и сделать оставшуюся работу.
DOM - изначально не сериализованные данные - т.е. Xml читается целиком с поддержкой всех вложенных структур и т.д. То есть десириализовывать ничего не нужно - оно и так в объектном виде. Нужно только создать нужные классы.
« Последнее редактирование: Июль 21, 2009, 00:32 от break » Записан
max1983
Гость
« Ответ #2 : Июль 21, 2009, 08:43 »

Цитировать
Из приведенного фрагмента кода я ничего не понял.
Я сам иногда не понимаю что пишу  Подмигивающий
Просто в QT обнаружил аналогичный класс QXmlSerializer
Логично предположил что он делает тоже самое.
Только примеров не нашел, и зачем он так и не понял.

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

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

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

Десериализовать - подразумевалось заполнить данными свой класс из прочитанного XML;
Записан
BigZ
Гость
« Ответ #3 : Июль 21, 2009, 08:48 »

Есть предположим XML файл и его надо Десериализовать.
То есть прочитать и заснуть в класс.

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

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


Какой тип нужно сериализовать/десериализовать?
Записан
max1983
Гость
« Ответ #4 : Июль 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
ну эт ток кусок в середине много еще елементов
Записан
BigZ
Гость
« Ответ #5 : Июль 21, 2009, 10:15 »

В Qt не видно прямой поддержки серелизации/десерелизаци. Для простых типов вроде не сложно сделать. У вас там простые типы. Для сложных UI типов, наследников QWidget, можно попробовать посмотреть QAbstractFormBuilder.
Записан
max1983
Гость
« Ответ #6 : Июль 21, 2009, 15:10 »

Для простых типов вроде не сложно сделать. У вас там простые типы.
Все верно.
Только у меня много этих простых типов. То есть много разных XML c простыми типами.
И под каждый XML делать цикл надо.
Цитировать
В Qt не видно прямой поддержки серелизации/десерелизаци.
А может кто знает стороннию либу под C++?  Непонимающий
Записан
BigZ
Гость
« Ответ #7 : Июль 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, ...)
...
};
Записан
Rcus
Гость
« Ответ #8 : Июль 21, 2009, 16:58 »

Если есть какая-то общая задача, то первым делом надо смотреть в буст Улыбающийся http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html (там же есть ссылки и на другие библиотеки для сериализации)
Записан
TESTER
Гость
« Ответ #9 : Сентябрь 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
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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