Создание объектов паскаля по XSD схмеме
Модератор: Модераторы
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Создание объектов паскаля по XSD схмеме
Кто либо таким занимался?
Или надо будет самому велосипедить?
Или надо будет самому велосипедить?
Такого нету. Если сделаете выложите.
Лучше всего run-time создание.
Лучше всего run-time создание.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Pavia писал(а):Такого нету. Если сделаете выложите.
Похоже именно так и будет.
Pavia писал(а):Лучше всего run-time создание.
Вот это как?
Я планирую делать на базе своей библиотеки для сериализации объектов. Буду в итоге получать паскалевский модуль. Будет ли перенос всех правил валидации вводимых данных - пока не решил. Мне сейчас хотя бы структуру правильно формировать научиться. А то вручную это делать ...
Оформлю в виде отдельной утилиты для компиляции - по аналогии со своей же утилитой по переводу protobuf в паскаль.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Можно подглядеть у WST... Или даже использовать получится http://wiki.freepascal.org/Web_Service_Toolkit
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Сделал.
Генерим по XSD схеме объекты паскаля для работы с данными из XML
В первом приближении вроде работает.
Тесты проходят - xmllint соглашается с данными.
Исходники https://github.com/lalexs75/protobuf-fpc в папке compiler/xsd_pas
там же примеры схем, на которых я проверял.
сам конвертер в 2х видах - виузальная утилита и консольное приложение.
для сериализации использую пакет xmlobjects.lpk из этого же репозитария.
Генерим по XSD схеме объекты паскаля для работы с данными из XML
В первом приближении вроде работает.
Тесты проходят - xmllint соглашается с данными.
Исходники https://github.com/lalexs75/protobuf-fpc в папке compiler/xsd_pas
там же примеры схем, на которых я проверял.
сам конвертер в 2х видах - виузальная утилита и консольное приложение.
для сериализации использую пакет xmlobjects.lpk из этого же репозитария.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
alexs писал(а): сериализации объектов в виде JSON
Нативный fpjsonrtti это не то? Я этим модулем пользуюсь для сериализации и десериализации JSON
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Ichthyander писал(а):alexs писал(а): сериализации объектов в виде JSON
Нативный fpjsonrtti это не то? Я этим модулем пользуюсь для сериализации и десериализации JSON
Попробовал
В постейших случаях поведение одинаково.
Но если надо обрабатывать не заполненные поля - тут уже штатным не получается.
Также некоторые сложные json ответы от других сервисов тоже не получается штатным смоделировать.
Ну и открытые массивы он не умеет.
Для меня эти 3 пункта - критичны.
Ну и тот факт, что я планирую компилятор xsd доработать для вывода json объектов - то же будет хорошо.
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
Если интересна сериализация в runtime, то у меня есть пара новых типов Variant - VarDict (словарь, ассоциативный массив) и VarList (список, динамический массив).
Пример использования VarDict:
То есть, у переменной типа 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
Пример использования 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
