2013-06-30 48 views
0

我爲自定義XML(用於文件生成)定義了XSD方案。我有一個名爲type的屬性。我希望它接受預定義列表以及任何其他字符串值。因爲type可以是標準的(int,string等),也可以是自定義的(任何名稱)。可能嗎?該XML的xs:屬性接受預定義列表和任何其他字符串值

例子:

<submodel name="Country"> 
    <field name="Handler" type="Clients.CountryHandlerModel" /> 
    <field name="Name" type="string" /> 
</submodel> 

而且XSD描述爲type屬性:

<xs:attribute name="type" use="required"> 
    <xs:simpleType> 
     <xs:restriction> 
      <xs:simpleType> 
       <xs:list> 
        <xs:simpleType> 
         <xs:restriction base="xs:token"> 
          <xs:enumeration value="bit"/> 
          <xs:enumeration value="boolean"/> 
          <xs:enumeration value="int"/> 
          <xs:enumeration value="decimal"/> 
          <xs:enumeration value="double"/> 
          <xs:enumeration value="date"/> 
          <xs:enumeration value="datetime"/> 
          <xs:enumeration value="string"/> 
          <xs:enumeration value="binary"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:list> 
      </xs:simpleType> 
      <xs:minLength value="1"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:attribute> 

回答

0

有沒有點中有值的具體列表,如果你也接受任何其他值也是有效的。

讓我們想象一下你是一個模式驗證,試圖驗證值是否正確此類型相匹配。您可以通過預定義的列表查找匹配項,但是當值不在該列表中時會發生什麼?無論如何,您仍然接受它,因爲模式認爲任何其他字符串值都是有效的。所以檢查清單真的沒有意義。

只是要類型xs:stringxs:token,並留在這一點。

現在邁克爾·凱所取得的論點,更復雜的數據類型(用字符串的枚舉的工會)可能仍然是有些用處的,如果你使用的數據類型的架構。這種模式可能是這個樣子(只是展示讓事情變得簡單的xs:list元素的內容):

<xs:simpleType> 
    <xs:union> 
    <xs:simpleType> 
     <xs:restriction base="xs:token"> 
     <xs:enumeration value="bit"/> 
     <xs:enumeration value="boolean"/> 
     <xs:enumeration value="int"/> 
     <xs:enumeration value="decimal"/> 
     <xs:enumeration value="double"/> 
     <xs:enumeration value="date"/> 
     <xs:enumeration value="datetime"/> 
     <xs:enumeration value="string"/> 
     <xs:enumeration value="binary"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType> 
     <xs:restriction base="xs:token"/> 
    </xs:simpleType> 
    </xs:union> 
</xs:simpleType> 

但我仍然不認爲這將是任何使用你的。

說你想的是XSD轉換爲類序列化對象到XML或反之亦然的目的。考慮到您使用的是Visual Studio,我希望您會使用類似Microsoft's xsd utility的內容。但是,這將需要這個大量複雜的類型定義,並將其視爲一個簡單的字符串。再次沒有好處。

話雖如此,我承認,有可能是其他模式處理工具,或一個複雜的數據類型可以是一些使用的其他情況。但是,除非有人提供了一個真實世界的例子,我仍然相信一個簡單的字符串或令牌列表是最明智的解決方案。

+0

謝謝,我也想過了,這就是爲什麼我問可能性。 – colotiline

+0

我的真實世界經驗是,爲讀者閱讀的人類編寫模式幾乎總是有幫助的,而人類讀者往往比讀取模式的軟件更重要。半封閉列表(「x,y,z或w中的任何一個,或者如果這些列表中沒有一個適用,則表示任何字符串)與字符串對於衆所周知的值的期望不同。 (但是,是的,世界上有一些不是由Microsoft編寫的工具也是事實,並且有些工具提供了有關聯盟的哪個成員符合值的信息。) –

2

雖然James Holderness是正確的,如果您將純粹作爲yes/no函數進行驗證的話,如果您想進行數據類型化,那麼定義聯合類型的模式的成員是(a)包含允許列表的類型值和(b)xs:string有時可能很有用,因爲連接到節點的類型註釋將反映該值是否出現在列表中。但你需要更清楚你爲什麼要這樣做。

相關問題