我想为XML文件编写XML Schema:
<root>
<rate>10</rate>
<rate></rate>
<rate>15</rate>
...
</root>minOccurs为1,maxOccurs是无界的。必须有xs:integer类型,但如何处理呢?我不想写。
发布于 2012-06-28 20:12:44
您只能声明一个接受任何整数值或不接受任何内容的<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等方面的任何解释,因为从您的问题中,我认为您已经知道如何做到这一点。如果您需要进一步的信息,请让我知道。
发布于 2012-06-28 23:51:33
除了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进行数据绑定,它也可能工作得更好。
发布于 2012-06-29 00:54:42
我会编写您想要使用的XML模式。由于您将使用C++代码生成器,这将使事情变得容易得多(我是的负责人,所以我在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机制。https://stackoverflow.com/questions/11244148
复制相似问题