获取“字符串”的XML Schema Union对元素错误无效

时间:2016-12-01 21:21:05

标签: c# xml schema union

我是一名经验丰富的程序员,但最近才开始维护一个使用xml架构的应用程序。他们想要在接受经度的项目上添加一些验证。他们希望继续接受空白以及0,0.0000000,或者如果输入了另一个值,他们希望确保至少它在美国。 (即在-125和-67之间)

当前的xml架构只允许任何值。

<xs:element name="Location">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="LocLongitude"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

有多个供应商发送此信息。以下是他们可能发送的示例:

<Location>
  <LocLongitude xsi:type="xsd:string"></LocLongitude>
</Location>

现在看看用户想要什么,我发现我可以使用union来封装多个检查。这就是我现在正在使用的。

<xs:element name="Location">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="LocLongitude" nillable="true">
        <xs:simpleType>
          <xs:union>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value=""/>
                <xs:enumeration value="0"/>
              </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:double">
                <xs:minInclusive value="0.00000000"/>
                <xs:maxInclusive value="0.00000000"/>
              </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:double">
                <xs:minInclusive value="-125"/>
                <xs:maxInclusive value="-67"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果我使用它,它会正确验证:

<Location>
  <LocLongitude />
</Location>

现在,如果我使用当前供应商正在使用的内容(见下文):

<Location>
  <LocLongitude xsi:type="xsd:string"></LocLongitude>
</Location>

我们收到错误:

  

XSI:类型属性值'对元素'LOCLONGITUDE'无效,因为它不是来自模式中的类型有效的类型,或者因为它有XSI:类型派生被阻止。

我的问题是,我是否可以让这个工作仍然允许供应商包含xsi:type =“xsd:string”?

1 个答案:

答案 0 :(得分:0)

不,为xs:type选择的类型必须从关联元素提供的类型中有效地派生。您不能一方面定义限制值空间的类型,另一方面支持更广泛的xs:type声明。

另请参阅:How to restrict the value of an XML element using xsi:type in XSD?