最近,我发现我们的一个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框架一起使用时没有导致任何问题。我们处理这个问题太松散了,还是外部合作伙伴太严格了?
答案 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
}
因此,如果显然不正确,为什么不创建新版本的架构?