我有以下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或通过任何其他方式实现此输出。
答案 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。