使用xsd -cvc-length-valid ERROR使元素可选

Pra*_*ITI 5 xsd

<xs:element name="CurrencyCode" minOccurs="0">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="3" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

但如果我的值为空,则返回错误

cvc-length-valid:对于类型为'#AnonType_CurrencyCodeServiceServiceList'的长度为'3',值''with length ='0'不是facet-valid.

那我怎么处理呢?

Fil*_*urt 5

您的架构允许省略该CurrencyCode元素,但如果它存在,则其值必须是长度恰好为3个字符的字符串.

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

<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>
Run Code Online (Sandbox Code Playgroud)

但是,这将允许像" EU "这样的值不是有效的货币代码.


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

<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>
Run Code Online (Sandbox Code Playgroud)


jas*_*sso 5

<CurrencyCode>元素是可选的.而不是使用空值,最明显的做法是只删除整个元素,如果你不想给它任何实际值.

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

解决方案1,使用正则表达式进行限制

使用允许空字符串和所有3个字符长字符串的正则表达式来限制元素值.

<xs:element minOccurs="0" name="CurrencyCode-regex">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="|.{3}" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

垂直条|分隔允许的选项,点.允许任何字符和大括号{3}将长度限制为3.空字符串表示为eh ...在第一个引号和垂直条之间出现"无".

解决方案2,允许元素为可存档

添加属性nillable="true"<xs:element>.然后你可以使用属性xsi:nil="true"的实例文档,使该元素有一个空值.

<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>
Run Code Online (Sandbox Code Playgroud)

实例XML中的用法:

<CurrencyCode-nil xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:nil="true"></CurrencyCode-nil>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您还未指定xsi:nil="true"属性,则不允许使用空值.您还需要定义该xsi命名空间.

<!-- This causes a validation error -->
<CurrencyCode-nil></CurrencyCode-nil>
Run Code Online (Sandbox Code Playgroud)

解决方案3,定义默认值

为架构中的元素添加合适的默认值.默认值还必须满足元素值的限制.在模式验证后,只有在元素内容为空时,才会将默认值添加到已解析的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>
Run Code Online (Sandbox Code Playgroud)

验证前的XML实例:

<CurrencyCode-default></CurrencyCode-default>
Run Code Online (Sandbox Code Playgroud)

在架构验证之后如何解释实例文档:

<CurrencyCode-default>XXX</CurrencyCode-default>
Run Code Online (Sandbox Code Playgroud)

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

架构:

<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>
Run Code Online (Sandbox Code Playgroud)

有效的实例文档:

<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>
Run Code Online (Sandbox Code Playgroud)