不同的匿名XSL复杂类型具有不同的子元素,具有共同的名称-Delphi数据绑定和良好的设计



我收到了我们政府的XSL,内容如下:

<xs:element minOccurs="0" maxOccurs="1"
name="VATTaxFiles">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
name="R" nillable="true">
<xs:complexType>
some stanza 1
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1"
name="SocialSecurityTaxFiles">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
name="R" nillable="true">
<xs:complexType>
some stanza 2
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1"
name="IncomeTaxFiles">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
name="R" nillable="true">
<xs:complexType>
some stanza 3
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element> 

在我看来,这个模式的设计有两个糟糕的问题:1(它使用匿名复杂类型;2( 它具有共同名称(R(但形状不同的子元素。这真的是XSL的好设计还是坏设计?

当我试图从第三方工具使用这个模式时,这个设计会产生一个问题,例如从Delphi XML数据绑定,我试图用它生成Delphi XML绑定*.pas单元,但当然,XML绑定向导创建了3个接口IXMLR和3个类TXMLR,当然,这样的代码会被编译器拒绝。我试图为每个R提供特定的"绑定选项-标识符名称、数据类型",例如R_VAT、R_Social、R_Income。XML绑定工具生成了与这些单词集成的交互,但类名仍然是相同的TR

有没有办法为具有通用名称的不同元素配置XML数据绑定向导?

我不认为匿名复杂类型本质上是不好的,但使用它们会使类型不可重用,因此应该只对肯定只适用于一个元素的内容模型执行此操作。

如果不同的R元素有不同的内容模型,那么除了用这种方式描述结构之外,真的别无选择。就XML而言,这是一个非常合理的设计,但当然,如果您选择的数据绑定工具无法处理它,则需要找到一些变通方法。不要忽略将数据转换为数据绑定工具可以处理的不同格式的可能性。

解决方案是耐心使用XML数据绑定工具,但随后手动编辑生成的*.pas文件:

  • 将每个TRXML类重命名为TRXML_VATTRXML_SocialTRXML_Income
  • 针对每种类型的R修改代码注册码:RegisterChildNode('R', TXMLR_VAT);

然后编译成功。

我觉得使用匿名复杂类型是一种糟糕的设计。

最新更新