首页 > 解决方案 > 不同的匿名 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,这真的是好还是坏的设计?

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

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

标签: xmldelphidelphi-7

解决方案


我不认为匿名复杂类型本质上是不好的,但是使用它们会使类型不可重用,所以它应该只用于绝对只适用于一个元素的内容模型。

如果不同的 R 元素有不同的内容模型,那么就真的没有办法用这种方式来描述结构了。就 XML 而言,这是一个完美的设计,但当然,如果您选择的数据绑定工具无法处理它,您将需要找到一些解决方法。不要忽略对数据执行 XSLT 转换为数据绑定工具可以处理的不同格式的可能性。


推荐阅读