XSD:枚举重复

时间:2014-02-10 08:16:31

标签: xsd

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

<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框架一起使用时没有导致任何问题。我们处理这个问题太松散了,还是外部合作伙伴太严格了?

2 个答案:

答案 0 :(得分:2)

严格来说,问题的关键在于澄清一个人说that cannot ever work.

的背景。

就XSD规范而言,您的片段是有效的 - 因此该人是错误的。重复的枚举令人讨厌并且很可能表明存在错误,因为错字可能会错过其中一个可能的值...仍然是完全有效的。

1.0和1.1(第4.3.5节)中的XML Schema规范对枚举值的唯一性没有限制。一切都与It is an ·error· if any member of {value} is not in the ·value space· of {base type definition}.

有关

有趣的是,两个规范都可以在“模式架构”中设置约束以确保唯一性......但没有一个。

要扩展这个......很容易放置冗余约束;也可以使用正则表达式来编写枚举值序列。例如:

<?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静态分析工具来验证它在您的版本中不会发生(即使它是有效的)。

答案 1 :(得分:1)

我建议他们的投诉更具政治性而非技术动机。

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

例如:不会编译:

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

因此,如果显然不正确,为什么不创建新版本的架构?