jaxb为xsd:group生成的类

jaxb为xsd:group生成的类,xsd,jaxb,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"> &

我有以下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>

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

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

25至35
...
...
...
...
...
...
..
..
..
但我希望输出是这样的

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

25至35
...
...
..
...
...
..
...
...
..

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

如果要允许无限的序列,每个序列包含一个序列(姓名、电话、地址),则需要按此顺序将其从包含元素中删除(现在允许并且只需要其中一个,这是默认值):


然后需要声明序列是无界的。由于您声明了一个组,因此在引用该组时会执行以下操作:


这可能还不能解决你的问题。您说过JAXB正在使用
元素生成问题中包含的XML。您的模式无法验证这一点。我假设您正在用JAXB包装它(您没有显示代码),但是如果您可以编辑模式,那么最好这样做,因为您的XML将根据它进行验证)。实际的模式验证了这一点:

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

25至35
...
...
...
.. ...
...
...
经过修改后,现在它验证了这一点:

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

25至35
...
...
..
...
...
..
...
...
..
...
为了验证您希望它生成的XML,使用嵌套在
中的
序列,您需要在XML模式中为
元素添加声明,并从其内部引用组:

<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实例。

请包含您的代码。感谢helderdarocha的回复。但是序列中的maxoccurs正在抛出错误[error]s4s att不允许:属性“maxoccurs”不能出现在元素“sequence”中。可能是因为我在schemaSorry中使用了xmlns=”“。我犯了一个错误。如果在
complexType
中使用
sequence
,则可以将
maxOccurs
添加到序列中。但是,由于您使用的是组,因此可以将其添加到组引用中。我将编辑答案。