1

我为我的自定义 XML(用于文件生成)定义了 XSD 方案。我有一个名为type. 我希望它接受一个预定义的列表以及任何其他字符串值。因为它type可以是标准的(int、string 等)也可以是自定义的(任何名称)。可能吗?

XML 示例:

<submodel name="Country">
    <field name="Handler" type="Clients.CountryHandlerModel" />
    <field name="Name" type="string" />
</submodel>

以及该type属性的 XSD 描述:

<xs:attribute name="type" use="required">
    <xs:simpleType>
        <xs:restriction>
            <xs:simpleType>
                <xs:list>
                    <xs:simpleType>
                        <xs:restriction base="xs:token">
                            <xs:enumeration value="bit"/>
                            <xs:enumeration value="boolean"/>
                            <xs:enumeration value="int"/>
                            <xs:enumeration value="decimal"/>
                            <xs:enumeration value="double"/>
                            <xs:enumeration value="date"/>
                            <xs:enumeration value="datetime"/>
                            <xs:enumeration value="string"/>
                            <xs:enumeration value="binary"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:list>
            </xs:simpleType>
            <xs:minLength value="1"/>
        </xs:restriction>
    </xs:simpleType>
</xs:attribute>
4

3 回答 3

2

尽管如果您将验证纯粹视为是/否函数,那么 James Holderness 是正确的,但如果您想做数据类型化,那么定义联合类型的模式,其成员是 (a) 包含允许值列表的类型,以及 ( b) xs:string 有时很有用,因为附加到节点的类型注释将反映该值是否存在于列表中。但是你需要更清楚你为什么想要这个。

于 2013-06-30T14:06:55.670 回答
0

如果您也接受任何其他值作为有效值,那么拥有一个特定的值列表是没有意义的。

假设您是一个模式验证器,试图验证一个值是否正确匹配此类型。您可以通过预定义列表寻找匹配项,但是当该值不在该列表中时会发生什么?无论如何你都接受它,因为模式认为任何其他字符串值也是有效的。因此,检查列表确实没有意义。

只需制作类型xs:stringxs:token并保留它。

现在 Michael Kay 提出了一个论点,即如果您使用模式进行数据类型化,更复杂的数据类型(您的枚举与字符串的联合)可能仍然有用。这样的模式可能看起来像这样(仅显示xs:list元素的内容以保持简单):

<xs:simpleType>
  <xs:union>
    <xs:simpleType>
      <xs:restriction base="xs:token">
        <xs:enumeration value="bit"/>
        <xs:enumeration value="boolean"/>
        <xs:enumeration value="int"/>
        <xs:enumeration value="decimal"/>
        <xs:enumeration value="double"/>
        <xs:enumeration value="date"/>
        <xs:enumeration value="datetime"/>
        <xs:enumeration value="string"/>
        <xs:enumeration value="binary"/>
      </xs:restriction>
    </xs:simpleType>
    <xs:simpleType>
      <xs:restriction base="xs:token"/>
    </xs:simpleType>
  </xs:union>
</xs:simpleType>

但我仍然认为这对你没有任何用处。

假设您想将该 xsd 转换为一个类,以便将对象序列化为 XML,反之亦然。鉴于您使用的是 Visual Studio,我希望您会使用类似Microsoft 的 xsd 实用程序。但这将采用这个非常复杂的类型定义,并将其视为一个简单的字符串。再次没有任何好处。

话虽如此,我承认可能还有其他模式处理工具,或者复杂数据类型可能有用的其他情况。但在有人提供这种用法的真实示例之前,我仍然相信字符串或标记的简单列表是最明智的解决方案。

于 2013-06-30T11:59:02.303 回答
0

您可以完成一个字符串字段,您可以为用户提供一些选项,以Discoverability通过使用来改进用户想要的任何值union

这是我的示例,用户可以选择预定义的语言验证或任何类型

<xsd:simpleType name="system_languages_plus">
    <xsd:union>
        <xsd:simpleType>  <!--the current implemented validations -->
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="html" />
                <xsd:enumeration value="json" />
                <xsd:enumeration value="xml" />
            </xsd:restriction>
        </xsd:simpleType>
        <xsd:simpleType> <!--the user can add his own validation -->
            <xsd:restriction base="xsd:string">
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:union>
</xsd:simpleType>
于 2020-04-06T15:50:45.803 回答