Создание объектов паскаля по XSD схмеме

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Создание объектов паскаля по XSD схмеме

Сообщение alexs »

Кто либо таким занимался?
Или надо будет самому велосипедить?
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Сообщение Pavia »

Такого нету. Если сделаете выложите.
Лучше всего run-time создание.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Pavia писал(а):Такого нету. Если сделаете выложите.

Похоже именно так и будет.
Pavia писал(а):Лучше всего run-time создание.

Вот это как?
Я планирую делать на базе своей библиотеки для сериализации объектов. Буду в итоге получать паскалевский модуль. Будет ли перенос всех правил валидации вводимых данных - пока не решил. Мне сейчас хотя бы структуру правильно формировать научиться. А то вручную это делать ...
Оформлю в виде отдельной утилиты для компиляции - по аналогии со своей же утилитой по переводу protobuf в паскаль.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Можно подглядеть у WST... Или даже использовать получится http://wiki.freepascal.org/Web_Service_Toolkit
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ichthyander
Спасибо
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Сделал.
Генерим по XSD схеме объекты паскаля для работы с данными из XML
В первом приближении вроде работает.
Тесты проходят - xmllint соглашается с данными.
Исходники https://github.com/lalexs75/protobuf-fpc в папке compiler/xsd_pas
там же примеры схем, на которых я проверял.
сам конвертер в 2х видах - виузальная утилита и консольное приложение.
для сериализации использую пакет xmlobjects.lpk из этого же репозитария.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Начал работу над поддержкой сериализации объектов в виде JSON.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

alexs писал(а): сериализации объектов в виде JSON

Нативный fpjsonrtti это не то? Я этим модулем пользуюсь для сериализации и десериализации JSON
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

В принципе смысл тот же
Я его раньше не видел. Надо попробовать.
Мой родился как ответвление от сериализации XML. А там я в первую очередь делал создание объектов на основе XSD схем.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ichthyander писал(а):
alexs писал(а): сериализации объектов в виде JSON

Нативный fpjsonrtti это не то? Я этим модулем пользуюсь для сериализации и десериализации JSON

Попробовал
В постейших случаях поведение одинаково.
Но если надо обрабатывать не заполненные поля - тут уже штатным не получается.
Также некоторые сложные json ответы от других сервисов тоже не получается штатным смоделировать.
Ну и открытые массивы он не умеет.
Для меня эти 3 пункта - критичны.

Ну и тот факт, что я планирую компилятор xsd доработать для вывода json объектов - то же будет хорошо.
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

Если интересна сериализация в runtime, то у меня есть пара новых типов Variant - VarDict (словарь, ассоциативный массив) и VarList (список, динамический массив).

Пример использования VarDict:

Код: Выделить всё

var MyDict: Variant;
MyDict := VarDictCreate();
MyDict.Field1 := 1;
MyDict.Field2 := 'test';
WriteLn(MyDict);  //  {Field1:1,Field2:"test"}


То есть, у переменной типа Variant можно "на ходу" создавать и использовать новые поля типа Variant, в том числе вложенные VarDict и VarList.

Методы:
GetCount() - get stored items count
GetValue(Index) - get item value for given Index (0..GetCount()-1)
GetName(Index) - get item name for given Index (0..GetCount()-1)
GetNameIndex(Name) - get index of item Name, or <0 if Name not found


Исходники:
https://github.com/serbod/NovaLib/blob/ ... rDicts.pas
https://github.com/serbod/NovaLib/blob/ ... rLists.pas

Модули для сериализации:
https://github.com/serbod/NovaLib/blob/ ... zeBase.pas - базовый класс сериализатора
https://github.com/serbod/NovaLib/blob/ ... onUnit.pas - сериализация JSON
https://github.com/serbod/NovaLib/blob/ ... deUnit.pas - сериализация Bencode
Ответить