【问题标题】:How to write XSD for optional elements?如何为可选元素编写 XSD?
【发布时间】:2015-12-14 16:24:40
【问题描述】:

输入:

<params>
   <param name ="query" >
    <queryData>
        <criterialist  isCaseSensitive ="true">
            <criteria>
                <condition>is</condition>
                <value>2</value>
                <attributeName>ActivityVersionId</attributeName>
            </criteria>
        </criterialist>
       </queryData>
   </param>
</params>

在上述输入中,criterialist 是可选的。所以我也可以有如下输入。

<params>
  <param name ="query" >
    <queryData>
       </queryData>
  </param>
</params>

如何使用单个 XSD 验证上述输入?

我现在使用的 XSD 是:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="params" type="paramsType"/>
  <xs:complexType name="criteriaType">
    <xs:sequence>
      <xs:element type="xs:string" name="condition"/>
      <xs:element type="xs:byte" name="value"/>
      <xs:element type="xs:string" name="attributeName"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="criterialistType">
    <xs:sequence>
      <xs:element type="criteriaType" name="criteria"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="isCaseSensitive"/>
  </xs:complexType>
  <xs:complexType name="queryDataType">
    <xs:sequence>
      <xs:element type="criterialistType" name="criterialist"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="paramType">
    <xs:sequence>
      <xs:element type="queryDataType" name="queryData"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name"/>
  </xs:complexType>
  <xs:complexType name="paramsType">
    <xs:sequence>
      <xs:element type="paramType" name="param"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

这会验证第一个输入,但不会验证第二个。

【问题讨论】:

标签: xml xsd xsd-validation


【解决方案1】:

正如评论中已经指出的,使用minOccurs="0"

<xs:complexType name="queryDataType">
    <xs:sequence>
        <xs:element type="criterialistType" name="criterialist" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

通过此修改,您将能够验证没有criterialist 元素的文档:

<params>
    <param name ="query" >
        <queryData>
        </queryData>
    </param>
</params>

但在criterialist 内包含多个criteria 元素的文档:

<params>
    <param name ="query" >
        <queryData>
            <criterialist  isCaseSensitive ="true">
                <criteria>
                    <condition>is</condition>
                    <value>2</value>
                    <attributeName>ActivityVersionId</attributeName>
                </criteria>
                <criteria>
                    <condition>is not</condition>
                    <value>4</value>
                    <attributeName>SomethingElse</attributeName>
                </criteria>
            </criterialist>
        </queryData>
    </param>
</params>

仍然不允许。在我看来,“列表”表明您还打算允许以下内容,maxOccurs

<xs:complexType name="criterialistType">
    <xs:sequence>
        <xs:element type="criteriaType" name="criteria" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="isCaseSensitive"/>
</xs:complexType>

【讨论】:

  • 在将其发布到此处之前,我尝试使用 minOccurs="0",但当时并没有奏效。不知道为什么?现在它正在工作!
  • @Sammy 也许您在 XSD 的错误位置添加了 minOccurs,或者忘记保存,或者忘记再次验证?您使用什么工具进行验证?
  • @Sammy,很高兴听到您解决了问题。如果对您有帮助,请accept Mathias 回答。谢谢。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2019-07-15
相关资源
最近更新 更多