Xml 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

我正在创建一个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>
<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中的“架构编辑器”。“空”枚举值实际上是一个空格。我用一个常规的文本编辑器打开了它,删除了空格,并进行了验证。非常感谢。