2012-06-28 104 views
2

我想寫的XML Schema的XML文件:如何爲以下XML編寫XML Schema?

<root> 
    <rate>10</rate> 
    <rate></rate> 
    <rate>15</rate> 
    ... 
</root> 

<率>的minOccurs爲1,maxOccurs的是無界的。 <率>必須有xs:整數類型,但如何處理<費率> < /費率>?我不想寫< rate xsi:nil =「true」/ >。

回答

4

而不是一個<rate>元件與xs:integer內容,另一種沒有任何內容,則可以僅聲明接受的任何整數值或沒有作爲其內容之一<rate>元件。

實際上,這可以與<xs:union>元素來完成:

<xs:simpleType name="emptyString"> 
    <xs:restriction base="xs:string"> 
    <xs:maxLength value="0"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:element name="rate"> 
    <xs:simpleType> 
     <xs:union memberTypes="xs:integer emptyString"/> 
    </xs:simpleType> 
</xs:element> 

這將接受<rate/><rate></rate><rate>42</rate>(或任何其他xs:integer值),而不是<rate>Hello, World!</rate>

請注意,爲此,您必須將模式中的無前綴名稱空間設置爲與您的目標名稱空間相同,否則memberTypes屬性中的emptyString將不會找到。因爲從你的問題(當然,你可以代替也可以定義一個前綴爲您的目標命名空間和使用。)

我省略瞭如何編寫完整的架構,以及如何任何解釋使用maxOccurs等我的身影你已經知道如何做到這一點。請讓我知道你是否需要任何進一步的信息。

+0

謝謝。我考慮過這個問題,但希望找到更漂亮的解決方案,因爲我要通過模式生成C++代碼。 – dizel3d

+0

@ dizel3d:啊,我明白了。然後它很大程度上取決於C++代碼生成器對模式/聯合的作用。當用手寫這個部分時,你仍然可以用一個可空的int來表示它。 –

1

O.R.Mapper的方法的替代方法是將元素的類型聲明爲maxLength = 1的整數列表。

<xs:element name="rate"> 
    <xs:simpleType> 
     <xs:restriction base="listOfInteger"> 
      <xs:maxLength value="1"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

<xs:simpleType name="listOfInteger"> 
    <xs:list itemType="xs:integer"/> 
</xs:simpleType> 

我傾向於這種做法更喜歡使用(整數,零長度字符串),因爲它更容易在模式感知的XQuery和XSLT應用程序處理的聯合。如果您使用JAXB進行數據綁定,它可能會更好,我不知道。

0

我會按照您打算使用的那樣編寫XML模式。由於您將使用C++代碼生成器,所以這會讓事情變得更容易(我是EclipseLink JAXB (MOXy)的領先者,所以我在Java方面有此經驗)。

<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="rate" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

既然你預計接收無效的數據,你有以下幾種選擇:

  1. 你的對象到XML解決方案將期望的方式自動處理無效的數據給你。例如JAXB被設計爲可以容忍不好的數據。
  2. 您的對象到XML解決方案爲您提供了一種機制來處理可用於解決問題的錯誤數據。 JAXB例如提供了ValidationEventHandler機制。