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

时间:2011-02-18 10:40:03

标签: xsd

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

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

  

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

那我怎么处理呢?

2 个答案:

答案 0 :(得分: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>

但是,这将允许“ 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>

答案 1 :(得分: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>

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

解决方案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>

实例XML中的用法:

<CurrencyCode-nil xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:nil="true"></CurrencyCode-nil>

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

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

解决方案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>

验证前的XML实例:

<CurrencyCode-default></CurrencyCode-default>

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

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

以下是一个示例架构和一个对此架构有效的示例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>

有效的实例文档:

<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>