2015-12-14 56 views
0

輸入:如何爲可選元素編寫XSD?

<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

可選是的minOccurs - > http://www.w3schools.com/xml/schema_complex_indicators.asp –

+0

的可能的複製[如何使XML模式中的元素可選?](http://stackoverflow.com/questions/9243772/how-to-make-an-element-in-xml-schema-optional) – kjhughes

回答

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

我嘗試過'minOccurs =「 0「'在發佈之前,但它沒有在那個時間。不知道爲什麼? 現在它正在工作! – Sammy

+0

@Sammy也許你在XSD的錯誤位置添加了'minOccurs',或者忘記保存,或者忘記再次驗證了?您使用什麼工具進行驗證? –

+2

@Sammy,很高興聽到你解決了你的問題。請[**接受**](http://meta.stackoverflow.com/q/5234/234215)Mathias的答案,如果它幫助你。謝謝。 – kjhughes