如何解决不同的匿名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>
在我看来,此模式的设计存在2个坏问题:1)它使用匿名复杂类型; 2)它具有具有相同名称(R
)但形状不同的子元素。对于XSL,这真的是好设计还是坏设计?
当我尝试通过第三方工具使用此架构时,此设计会产生问题。从Delphi XML数据绑定中尝试生成Delphi XML绑定* .pas单元,但是XML绑定向导当然会创建3个接口IXMLR和3个类TXMLR,当然,此类代码会被编译器拒绝。我试图为每个R提供特定的``绑定选项-标识符名称,数据类型''-例如R_VAT,R_Social,R_Income。而且XML绑定工具会生成与这些单词相互关联的界面,但是类名仍是相同的TR。
是否可以使用通用名称为不同元素配置XML数据绑定向导?
解决方法
解决方案是对XML Databinding工具保持耐心,然后手动编辑生成的*.pas
文件:
- 将每个
TRXML
类重命名为TRXML_VAT
,TRXML_Social
,TRXML_Income
。 - 为每种类型的R修改代码注册代码:
RegisterChildNode('R',TXMLR_VAT);
。
然后编译成功完成。
我觉得使用匿名复杂类型是不好的设计。
,我不认为匿名复杂类型本质上是不好的,但是使用它们会使这些类型不可重用,因此只应对绝对只适用于一个元素的内容模型进行操作。
如果不同的R元素具有不同的内容模型,那么除了以这种方式描述结构外,别无选择。就XML而言,这是一个完美的设计,但是,当然,如果您选择的数据绑定工具无法处理它,则需要找到一些解决方法。不要忽略对数据进行XSLT转换为数据绑定工具可以处理的另一种格式的可能性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。