При работе с веб-сервисами в Delphi часто возникают вопросы, связанные с импортом WSDL-файлов. Одна из таких проблем связана с правильной генерацией типов, которые наследуются от других типов. В данной статье мы рассмотрим, как решить проблему, возникшую при импорте WSDL в Delphi 2007, и получим корректную генерацию типов, использующих наследование.
Проблема с импортом WSDL
При использовании Delphi 2007 для клиентской стороны веб-сервисов, пользователь столкнулся с проблемой при импорте WSDL с адреса https://services.rdc.nl/voertuigscan/2.0/wsdl. В WSDL-файле использовался XSD для определения типов, и среди импортированных XSD был определён тип BedragExtended, который наследует свойства от типа ct:Bedrag. Однако, при импорте, тип BedragExtended был представлен без упоминания базового типа Bedrag, хотя в заголовке сгенерированного файла .pas было указано, что XSD корректно обработаны. Вопрос заключался в том, как заставить Delphi корректно сгенерировать тип BedragExtended.
Структура типов в XSD
Тип BedragExtended определяется следующим образом:
// ************************************************************************ //
// XML : BedragExtended, global, <complexType>
// Namespace : http://nsp.rdc.nl/RDC/voertuigscan
// ************************************************************************ //
BedragExtended = class(TRemotable)
private
FBron: Bron;
FBron_Specified: boolean;
procedure SetBron(Index: Integer; const ABron: Bron);
function Bron_Specified(Index: Integer): boolean;
published
property Bron: Bron Index (IS_ATTR or IS_OPTN) read FBron write SetBron stored Bron_Specified;
end;
Как видно из кода, в сгенерированном классе отсутствует упоминание о базовом типе Bedrag.
Подтверждённый ответ
Проблема, с которой столкнулся пользователь, заключается в том, что Delphi некорректно обрабатывает типы, наследуемые с помощью расширения. Это связано с особенностями обработки простых и сложных типов в XSD 1.0. В соответствии с этим стандартом, сложные типы используются для добавления атрибутов, а простые типы (простой контент) - для ограничения возможных значений элемента текстовым способом.
В случае с BedragExtended, который является сложным типом с простым содержимым, расширение используется для добавления атрибута Bron, тогда как базовый тип Bedrag предполагает ограничение на представление простого числа в виде десятичного числа с заданной точностью.
Альтернативный ответ
В альтернативном ответе отмечается, что в большинстве языков программирования простые типы обычно не сопоставляются с классами, за исключением случаев, когда простой тип использует перечисление (enumeration facet), в котором случае может быть сгенерировано типобезопасное перечисление. Это объясняет, почему Delphi не генерирует классы для простых типов, таких как Bedrag, и вместо этого использует примитивные типы данных.
Рекомендации по решению проблемы
Для решения проблемы с импортом WSDL в Delphi 2007 и корректной генерацией типов с наследованием, можно попробовать следующие шаги:
Проверьте, не было ли в процессе импорта WSDL пропущено каких-либо шагов или опций в настройках Delphi.
Убедитесь, что все необходимые XSD-файлы корректно включены в проект и доступны во время обработки WSDL.
Если проблема сохраняется, рассмотрите возможность ручного редактирования сгенерированного кода для корректного отображения наследования типов.
В крайнем случае, если стандартный импорт WSDL не может быть адаптирован под ваши нужды, можно рассмотреть возможность написания собственного компонента для обработки WSDL, который будет учитывать специфику вашего проекта.
Пример кода
Для демонстрации, как может быть изменён сгенерированный код, рассмотрим пример:
TBedragExtended = class(TRemotable)
private
FValue: Double;
FBron: Bron;
FBronSpecified: Boolean;
procedure SetValue(const Value: Double);
function GetValue: Double;
procedure SetBron(const Value: Bron);
function GetBron: Bron;
function IsBronSpecified: Boolean;
published
property Value: Double read GetValue write SetValue;
property Bron: Bron read GetBron write SetBron default;
function IsBronSpecified: Boolean;
end;
В этом примере мы создаём новый класс TBedragExtended, который включает в себя свойство Value типа Double, которое соответствует базовому типу Bedrag, а также свойство Bron и индикатор его заполнения.
Заключение
При работе с WSDL и XSD в Delphi важно понимать, как работает сопоставление типов между XML-схемами и сгенерированными классами в Delphi. В случае возникновения проблем, важно внимательно изучить структуру XSD и корректно настроить импорт WSDL, а при необходимости - отредактировать сгенерированный код вручную.
Проблема заключается в некорректной генерации типов с наследованием при импорте WSDL в Delphi 2007, что требует ручной корректировки кода для правильного отображения структуры типов, определенных в XSD.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS