如何为以下XML编写XML Schema?

时间:2012-06-28 11:59:30

标签: xml xsd

我想为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;。

3 个答案:

答案 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>

由于您预计会收到无效数据,因此您有以下选择:

  1. 您的对象到XML解决方案将以所需方式自动处理此无效数据。例如,JAXB旨在容忍不良数据。
  2. 您的对象到XML解决方案为您提供了一种机制来处理可用于解决问题的错误数据。例如,JAXB提供ValidationEventHandler机制。