使用xsd-cvc length valid错误使元素可选

使用xsd-cvc length valid错误使元素可选,xsd,Xsd,但如果我的值为空,它将返回一个错误 cvc长度有效:长度为“0”的值“”对于类型“#AnonType_CurrencyCodeServiceList”的长度“3”无效 那么我该如何处理它呢?您的模式允许省略CurrencyCode元素,但如果它存在,则其值必须是长度正好为3个字符的字符串 您可以通过指定“最小长度”和“最大长度”来削弱允许0长度值的限制: <xs:element name="CurrencyCode" minOccurs="0"> <xs:simpleTyp

但如果我的值为空,它将返回一个错误

cvc长度有效:长度为“0”的值“”对于类型“#AnonType_CurrencyCodeServiceList”的长度“3”无效


那么我该如何处理它呢?

您的模式允许省略
CurrencyCode
元素,但如果它存在,则其值必须是长度正好为3个字符的字符串

您可以通过指定“最小长度”和“最大长度”来削弱允许0长度值的限制:

<xs:element name="CurrencyCode" minOccurs="0">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="3" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>

但是,这将允许使用“EU”等不是有效货币代码的值


另一种方法是,指定有效货币代码值列表并将空字符串作为有效代码:

<xs:element name="CurrencyCode" minOccurs="0">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:minLength value="0" />
            <xs:maxLength value="3" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

元素是可选的。与其使用空值,最明显的做法是,如果不想为整个元素提供任何实际值,只需删除整个元素

如果出于某种原因仍希望允许空字符串和3个字符长的字符串,则至少有3个选项不需要削弱限制或列出所有可能的值(=无枚举)

解决方案1,使用正则表达式进行限制 使用允许空字符串和所有3个字符长字符串的正则表达式限制元素值

<xs:element name="CurrencyCode" minOccurs="0">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value=""/>
            <xs:enumeration value="USD"/>
            <xs:enumeration value="GBP"/>
            <xs:enumeration value="EUR"/>
            <!-- add all currency codes you need -->
        </xs:restriction>
    </xs:simpleType>
</xs:element>
实例XML中的用法:

<xs:element minOccurs="0" name="CurrencyCode-nil" nillable="true">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="3" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>
解决方案3,定义一个默认值 为模式中的元素添加合适的默认值。默认值还必须满足元素值的限制。在模式验证之后,仅当元素内容为空时,才会将默认值添加到已解析的XML树中

<!-- This causes a validation error -->
<CurrencyCode-nil></CurrencyCode-nil>

验证前的XML实例:

<xs:element minOccurs="0" default="XXX" name="CurrencyCode-default">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="3" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>
<CurrencyCode-default></CurrencyCode-default>

模式验证后如何解释实例文档:

<xs:element minOccurs="0" default="XXX" name="CurrencyCode-default">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="3" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>
<CurrencyCode-default></CurrencyCode-default>
XXX

下面是一个示例模式和一个对该模式有效的示例XML文档

模式:

<CurrencyCode-default>XXX</CurrencyCode-default>

有效的实例文档:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence maxOccurs="2">
        <xs:element minOccurs="0" name="CurrencyCode-regex">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="|.{3}" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" name="CurrencyCode-nil" nillable="true">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:length value="3" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" default="XXX" name="CurrencyCode-default">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:length value="3" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

基础知识
基础知识
基础知识
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CurrencyCode-regex>ABC</CurrencyCode-regex>
  <CurrencyCode-nil>ABC</CurrencyCode-nil>
  <CurrencyCode-default>ABC</CurrencyCode-default>
  <CurrencyCode-regex></CurrencyCode-regex>
  <CurrencyCode-nil xsi:nil="true"></CurrencyCode-nil>
  <CurrencyCode-default></CurrencyCode-default>
</root>