jaxb为xsd:group生成了类

时间:2014-03-11 14:24:41

标签: xsd jaxb

我有以下xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
        <xs:element name="root">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="age"/>
                    <xs:group ref="gp.contacts"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:group name="gp.contacts">
            <xs:sequence>
                <xs:element ref="name" maxOccurs="unbounded"/>
                <xs:element ref="phone" maxOccurs="unbounded"/>
                <xs:element ref="address" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:group>
    </xs:schema>
</xs:schema>

然后我在创建xml时使用jaxb,输出为

<root>
   <age>25to35</age>
   <contacts>
      <name>...</name>
      <name>...</name>
      <name>...</name>
      <phone>...</phone>
      <phone>...</phone>
      <phone>...</phone>
      <address>..</address>
      <address>..</address>
      <address>..</address>
  </contacts>
</root>

但我希望输出像这样

<root>
   <age>25to35</age>
   <contacts>
      <name>...</name>
      <phone>...</phone>
      <address>..</address>
      <name>...</name>
      <phone>...</phone>
      <address>..</address>
      <name>...</name>
      <phone>...</phone>
      <address>..</address>
  </contacts>
</root>

有人可以告诉我是否可以通过修改xsd或jaxb或通过任何其他方式实现此输出。

1 个答案:

答案 0 :(得分:0)

如果你想允许无界序列,每个序列,每个序列,你需要从包含的元素中删除它(这将是现在允许并且只需要每个中的一个,这是默认值:

(name, phone, address)

然后你需要声明序列是无界的。由于您声明了一个组,因此当您引用时,您就会这样做:

<xs:group name="gp.contacts">
    <xs:sequence>
        <xs:element name="name"/>
        <xs:element name="phone"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

这可能无法解决您的问题。您说JAXB使用<xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element ref="age"/> <xs:group ref="gp.contacts" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> 元素生成您在问题中包含的XML。您的架构不会验证它。我假设您在JAXB中包装它(您没有显示您的代码),但如果您可以编辑模式,那么最好这样做,因为您的XML将对其进行验证)。架构实际上验证了这一点:

<contacts>

通过修改,现在验证了这一点:

<root>
    <age>25to35</age>
    <name>...</name>
    <name>...</name>
    ...
    <address>..</address> ...
    <phone>...</phone>
    ...
</root>

要验证您希望它生成的XML,<root> <age>25to35</age> <name>...</name> <phone>...</phone> <address>..</address> <name>...</name> <phone>...</phone> <address>..</address> <name>...</name> <phone>...</phone> <address>..</address> ... </root> <name><phone>序列嵌套在<address>中,您需要添加声明XML Schema中的<contacts>元素,并从中引用该组:

<contacts>

您的架构也增加了<xs:element name="root"> <xs:complexType> <xs:sequence maxOccurs="unbounded"> <xs:element name="age" type="xs:string"/> <xs:element name="contacts"> <xs:complexType> <xs:group ref="gp.contacts" maxOccurs="unbounded"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 个根元素(我认为这是一个剪切和粘贴错误。)

如果您解决了这些问题,可以使用该模式为JAXB生成类,这些类将为您创建所需的实例XML。