【问题标题】:Delphi WSDL Import does not parse types derived by extensionDelphi WSDL Import 不解析扩展派生的类型
【发布时间】:2012-08-14 08:18:47
【问题描述】:

我正在尝试使用 Delphi 2007 导入 wsdl 以供客户端使用。

我已经在https://services.rdc.nl/voertuigscan/2.0/wsdl 导入了WSDL,它导入了一个xsd 来定义它的类型。在导入的xsd中,还有几个额外的导入和包含的xsd,其中定义了如下类型:

<xs:complexType name="BedragExtended">
  <xs:simpleContent>
    <xs:extension base="ct:Bedrag">
      <xs:attribute name="Bron" type="Bron"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

类型 ct:Bedrag 在包含的 XSD 中定义为:

<xs:simpleType name="Bedrag">
  <xs:restriction base="xs:decimal">
    <xs:totalDigits value="9"/>
    <xs:fractionDigits value="2"/>
  </xs:restriction>
</xs:simpleType>

但是,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 类型的基础值,但 wsdl 导入生成的 .pas 文件顶部的标头显示正确的 xsd 已被解析。如何让 Delphi 正确生成 BedragExtended 类型?

【问题讨论】:

标签: web-services delphi soap xsd wsdl


【解决方案1】:

在所有语言中看到这种行为是相当典型的(至少我知道)。简单类型通常不映射到类。唯一值得注意的例外是使用枚举方面的简单类型,在这种情况下,您可能会获得类型安全的枚举(Java 和 .NET)。

这是意料之中的,因为BedragExtended 是一个带有属性的字符串。不幸的是,在 XSD 1.0 中,您不能同时进行扩展(设置属性)和限制(限制词法空间),因此这种实现很常见,它是一种复杂类型(获取属性)但内容很简单(基本上是某种文本)。

【讨论】:

  • 你是说不可能吗? BedragExtended 是带有附加属性的小数。 Bedrag 确实在导入的 WSDL 中作为 integer 找到,但 BedragBedragExtended 之间的整个关系已经消失。
  • 我没看过。正如我所说,除了具有枚举方面的简单类型之外,简单类型不会映射到类。它们被映射到原语。
猜你喜欢
  • 2023-04-09
  • 2022-11-25
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
相关资源
最近更新 更多