我正在创建一个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>
但显然这是无效的:
枚举约束失败。
我还尝试将空值显式添加到枚举中:
<xs:enumeration value="" />
但也没有运气:
枚举约束失败。
目前,我正在使用模式:
<xs:pattern value="[ABC]{0,1}" />
这有效,但我发现这是一个非常糟糕的方式来满足这么简单的要求。当然,我必须做些什么才能允许“从枚举或空洞中获取任何东西”?哦,不建议将minOccurs
设置为0
,标签必须始终在那里。
答案 0 :(得分:2)
我不知道您使用的是哪个验证器,但是如果您将<xs:enumeration value="" />
添加为限制标记的子级,那么<MyElement></MyElement>
是有效的(我确信这一点并且我已经对其进行了测试在 oXygen 和几个在线验证器以防万一。)
因此,执行您想要执行的操作的正确方法是使用空枚举值或使用模式限制。换句话说,您在问题中提供的两个解决方案是正确的尽管您的验证人员并不这么认为枚举(也许这是一个错误,也许是一个错字完全架构,我不知道。)
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 < / em>将内容和 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,并检查验证器的奇怪行为。