我正在创建一个 XSD,其中一个元素需要为空或来自枚举的值:
<xs:element name="MyElement" nillable="true">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="A" />
<xs:enumeration value="B" />
<xs:enumeration value="C" />
</xs:restriction>
</xs:simpleType>
</xs:element>
我曾希望通过将 nillable
属性设置为 true
,它会允许 A、B、C 或空值:
<MyElement></MyElement>
但显然这是无效的:
The Enumeration constraint failed.
我还尝试将空值显式添加到枚举中:
<xs:enumeration value="" />
但也没有运气:
The Enumeration constraint failed.
目前,我正在使用一种模式:
<xs:pattern value="[ABC]{0,1}" />
这行得通,但我发现对于这样一个简单的要求,这是一种糟糕的方法。当然必须有一些我可以做的事情来允许“枚举中的任何内容或空的”?哦,不建议将 minOccurs
设置为 0
,标签必须始终存在。
最佳答案
关于使用空值
我不知道您使用的是什么验证器,但如果您添加 <xs:enumeration value="" />
然后作为限制标签的子元素 <MyElement></MyElement>
是有效的(我确信这一点并且我已经在 oXygen 和几个在线验证器中对其进行了测试以防万一)。
所以做您想做的事情的正确方法是使用空枚举值或使用模式限制。换句话说,您在问题中提供的两个解决方案是正确的,尽管您的验证器认为枚举不是这样(可能是错误,也可能是完整的架构,我不知道)。
关于nillable
Nillable
意味着在 XML 实例中,元素可以将 nil 属性 设置为 true,然后它应该为空。示例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="MyElement" type="xs:string" nillable="true"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
在下面的示例中,MyElement 将 nil 属性设置为 true 并且它是空的,因此它对示例 XML Schema 有效(注意如果 MyElement 有内容并且 nil 设置为 true,则无效)
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:ns="http://www.w3.org/2001/XMLSchema-instance">
<MyElement ns:nil="true"></MyElement>
</root>
所以在我看来,使用 nillable 并不是一个好的解决方案,因为您必须向 XML 实例添加一个属性。我建议不要使用 nillable,而是像您尝试的那样使用枚举,并检查验证器的奇怪行为。
关于xml - XSD - 可以为空的枚举限制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25060770/