所以我们在表单中有一个XSD类型:
<xs:complexType name="Foo">
<xs:all>
<xs:element name="Bars">
<xs:complexType>
<xs:sequence>
<xs:element name="Bar" type="barType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
表示XML:
<Foo>
<!-- Elements snipped for brevity-->
<Bars>
<Bar>
<!-- Bar Element -->
</Bar>
</Bars>
</Foo>
Run Code Online (Sandbox Code Playgroud)
xjc产生几乎正确的结果.唯一令人讨厌的事情是"Bars"被创建为一个内部类,它存储一个Bars列表.反正有没有Bars在Foo中成为List而仍然保留上面的XML?
将Bars定义为复杂类型时,Bars将作为分隔的类生成.像这样我发现架构也更容易阅读.除非你将maxOccurs更改为大于1的值,否则Bars不会是Foo中的List - 你不能在xs:all上执行此操作,但你可以使用xs:sequence.
...
<xs:complexType name="Foo">
<xs:all>
<xs:element name="Bars" type="Bars" />
</xs:all>
</xs:complexType>
<xs:complexType name="Bars">
<xs:sequence>
<xs:element name="Bar" type="barType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
...
Run Code Online (Sandbox Code Playgroud)
运行xjc后:Foo.java:
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = {
})
public class Foo {
@XmlElement(name = "Bars", required = true)
protected Bars bars;
public Bars getBars() {
return bars;
}
public void setBars(Bars value) {
this.bars = value;
}
}
Run Code Online (Sandbox Code Playgroud)
Bars.java:
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Bars", propOrder = {
"bar"
})
public class Bars {
@XmlElement(name = "Bar", required = true)
protected List<String> bar;
...
}
Run Code Online (Sandbox Code Playgroud)
使用xs:seqence获取Bars列表(maxOccurs ="unbounded"):XSD:
...
<xs:complexType name="Foo">
<xs:sequence>
<xs:element name="Bars" type="Bars" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Bars">
<xs:sequence>
<xs:element name="Bar" type="barType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
...
Run Code Online (Sandbox Code Playgroud)
Foo.java:
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = {
"bars"
})
public class Foo {
@XmlElement(name = "Bars", required = true)
protected List<Bars> bars;
public List<Bars> getBars() {
if (bars == null) {
bars = new ArrayList<Bars>();
}
return this.bars;
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是删除周围的 <bars> 元素,XML 看起来不再那么漂亮,但它会使 java 代码更易于阅读。与 xjc 的简单绑定(请参阅http://jaxb.java.net/nonav/jaxb20-fcs/docs/vendorCustomizations.html)一起,它将生成非常漂亮且有用的 java 代码。