我想寫的XML Schema的XML文件:如何爲以下XML編寫XML Schema?
<root>
<rate>10</rate>
<rate></rate>
<rate>15</rate>
...
</root>
<率>的minOccurs爲1,maxOccurs的是無界的。 <率>必須有xs:整數類型,但如何處理<費率> < /費率>?我不想寫< rate xsi:nil =「true」/ >。
我想寫的XML Schema的XML文件:如何爲以下XML編寫XML Schema?
<root>
<rate>10</rate>
<rate></rate>
<rate>15</rate>
...
</root>
<率>的minOccurs爲1,maxOccurs的是無界的。 <率>必須有xs:整數類型,但如何處理<費率> < /費率>?我不想寫< rate xsi:nil =「true」/ >。
而不是一個<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
等我的身影你已經知道如何做到這一點。請讓我知道你是否需要任何進一步的信息。
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進行數據綁定,它可能會更好,我不知道。
我會按照您打算使用的那樣編寫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>
既然你預計接收無效的數據,你有以下幾種選擇:
ValidationEventHandler
機制。
謝謝。我考慮過這個問題,但希望找到更漂亮的解決方案,因爲我要通過模式生成C++代碼。 – dizel3d
@ dizel3d:啊,我明白了。然後它很大程度上取決於C++代碼生成器對模式/聯合的作用。當用手寫這個部分時,你仍然可以用一個可空的int來表示它。 –