Xml XSD-枚举限制值,可以为空
我正在创建一个XSD,其中一个元素需要为空或枚举中的值:Xml XSD-枚举限制值,可以为空,xml,xsd,nullable,enumeration,restriction,Xml,Xsd,Nullable,Enumeration,Restriction,我正在创建一个XSD,其中一个元素需要为空或枚举中的值: <xs:element name="MyElement" nillable="true"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="A" /> <xs:enumeration value="B" /> <xs:enumer
<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>
<xs:enumeration value="" />
但这显然是无效的:
枚举约束失败
我还尝试将空值显式添加到枚举:
<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>
<xs:enumeration value="" />
但也没有运气:
枚举约束失败
目前,我使用的是一种模式:
<xs:pattern value="[ABC]{0,1}" />
这是可行的,但我发现对于这样一个简单的需求来说,这是一种糟糕的方式。我肯定能做些什么来允许“枚举中的任何内容或空的”?哦,不要建议将minOccurs
设置为0
,标签必须始终在那里。关于使用空值
我不知道您使用的验证器是什么,但如果您将
添加为限制标签的子项,则
是有效的(我确信这一点,并且我已经在氧气和一些在线验证器中对其进行了测试,以防万一)
因此,正确的方法是使用空枚举值或使用模式限制。换句话说,您在问题中提供的两个解决方案都是正确的,尽管您的验证器在枚举中不这么认为(可能是一个bug,可能是完整模式中的一个输入错误,我不知道)
关于零
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模式有效(请注意,如果MyElement的content和nil设置为true,则无效)
因此,在我看来,使用nillable并不是一个好的解决方案,因为您必须向XML实例添加一个属性。与使用nillable不同,我建议您使用枚举,并检查验证器的奇怪行为。验证器在Visual Studio中,我认为它是BizTalk的扩展。事实证明,它不是验证器,而是Visual Studio中的“架构编辑器”。“空”枚举值实际上是一个空格。我用一个常规的文本编辑器打开了它,删除了空格,并进行了验证。非常感谢。