我想为XML文件编写XML Schema:
<root>
<rate>10</rate>
<rate></rate>
<rate>15</rate>
...
</root>
&LT;速率&GT; minOccurs是1,maxOccurs是无界的。 &LT;速率&GT;必须有xs:整数类型,但是如何处理&lt; rate&gt;&lt; / rate&gt;?我不想写&lt; rate xsi:nil =“true”/&gt;。
答案 0 :(得分: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>
。
请注意,要使其正常工作,您必须在架构中将无前缀名称空间设置为与目标名称空间相同,否则将无法找到emptyString
属性中的memberTypes
。 (当然,您也可以为目标命名空间定义一个前缀并使用它。)
我已经省略了关于如何编写完整模式以及如何使用maxOccurs
等的任何解释,因为根据您的问题,我认为您已经知道如何做到这一点。如果您需要任何进一步的信息,请与我们联系。
答案 1 :(得分: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使用数据绑定,它可能也会更好,我不知道。
答案 2 :(得分: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>
由于您预计会收到无效数据,因此您有以下选择:
ValidationEventHandler
机制。