输入:
<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>
这将验证第一个输入,但不验证第二个输入。
答案 0 :(得分: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>
但是criteria
中包含多个criterialist
元素的文档:
<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>
仍然不允许。在我看来,&#34; list&#34;建议您还打算允许以下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>