jaxb为xsd:group生成的类
我有以下xsdjaxb为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"> &
<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
添加到序列中。但是,由于您使用的是组,因此可以将其添加到组引用中。我将编辑答案。