XSD:枚举重复项

XSD:枚举重复项,xsd,Xsd,最近,我发现我们的一个xs:enumeration类型两次包含相同的值: <xs:simpleType name="typ-TypeCodeRequest"> <xs:restriction base="xs:string"> <xs:enumeration value="B1"/> <xs:enumeration value="B2"/> <xs:enu

最近,我发现我们的一个xs:enumeration类型两次包含相同的值:

<xs:simpleType name="typ-TypeCodeRequest">
        <xs:restriction base="xs:string">
            <xs:enumeration value="B1"/>
            <xs:enumeration value="B2"/>
            <xs:enumeration value="B2"/>
            <xs:enumeration value="B3"/>
            <xs:enumeration value="B4"/>
            <xs:enumeration value="B5"/>
        </xs:restriction>
    </xs:simpleType>

现在,一个外部合作伙伴对此提出了抱怨,声称“这永远行不通”。这让我有些困惑,因为我试图找出在枚举中是否允许重复条目——即使没有意义——都是徒劳的


任何验证都没有发现这是错误的,并且在生成代码并与Apaches CXF框架一起使用时也没有导致任何问题。我们是在处理这个问题上太过松懈,还是外部合作伙伴太过严格?

我认为他们的抱怨更具政治动机,而不是技术动机

但是,这显然是不正确的,如果您确实尝试将此枚举转换为c#中的类型,您将无法干净地执行此操作

例如:不会编译:

enum Color
{
    White = 0,
    Black = 1,
    Orange = 2,
    Orange = 3
}

因此,如果显然是不正确的,为什么不创建一个新的模式版本呢?

严格地说,问题的要点实际上是澄清一个人所说的
永远不可能起作用的上下文。

就XSD规范而言,您的片段是有效的——所以那个人是错的。重复的枚举很烦人,读起来很可能是错误,因为输入错误可能遗漏了一个可能的值。。。不过,这是完全正确的

1.0和1.1(第4.3.5节)中的XML模式规范对枚举值的唯一性没有限制。这都是关于
如果{value}的任何成员不在{base type definition}的·value空间中,这就是一个·错误。

有趣的是,这两个规范都可以在“schema for schema”中设置约束,以确保唯一性。。。但没有人这样做

要对此进行扩展。。。容易设置冗余约束;还可以使用正则表达式模式编写枚举值序列。例如:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="test" type="test"/>
    <xsd:simpleType name="test">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="y"/>
            <xsd:enumeration value="n"/>
            <xsd:pattern value="y|n"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

在这种情况下,该模式没有任何用处。。。然而,XSD规范并没有将其标记为错误(尽管这是多余的,因为枚举总是赢的)

也许那个人的问题是由某个程序绑定XSD到其他东西引起的。。。该程序正在创建重复条目,前提是枚举值应该是唯一的(这是一个错误的假设)


如果我是你,我会简单地修复XSD;并确保您正在使用一些XSD静态分析工具来验证它不会出现在您的版本中(即使是有效的)。

Total同意这一政治暗示。但是:它也不会用Java编译,但是wsdl2java会忽略一个重复的条目,并且只转换它一次,也就是说,它预计会发生这种容易出错的情况,这对我来说是另一个指标,即在xsd端不严格禁止重复条目。我明白你的意思。如果您知道您的消费者正在使用的工具,那么这很好,但是可能有一些工具(甚至验证器)不喜欢它。我纯粹是猜测。如果改变它很麻烦,见鬼,推开它,但是如果他们能够打破东西并追踪到你的复制品,就准备好谦虚地吃馅饼。