Khi bạn xác định Bars như một loại phức tạp, Bars sẽ được tạo ra như lớp tách ra. Như thế này tôi thấy lược đồ cũng dễ đọc hơn. Các thanh sẽ không được liệt kê trong Foo trừ khi bạn thay đổi maxOccurs thành một giá trị cao hơn 1 - bạn không thể làm điều này trên xs: tất cả nhưng bạn có thể sử dụng 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>
...
Sau khi chạy 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;
}
}
Bars.java:
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Bars", propOrder = {
"bar"
})
public class Bars {
@XmlElement(name = "Bar", required = true)
protected List<String> bar;
...
}
Với xs: seqence để có được danh sách các Bars (maxOccurs = "vô biên"): 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>
...
Foo.java: Plugin
...
@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;
}
}
Thật không may tôi đang cố gắng chuyển từ tệp xsd sang tệp java. – Jim
Tôi đang tìm kiếm một cái gì đó như thế này trong [câu hỏi của tôi ở đây] (http://stackoverflow.com/questions/9240837/how-to-write-my-xsd-in-order-to-match-the-desired-xml -and-java-format-using-jaxb). Có thể tạo chú thích '@ XmlElementWrapper' bằng XJC không? Tôi không muốn sửa đổi mã được tạo theo cách thủ công ... –
Blaise: trước hết, cảm ơn bạn rất nhiều cho tất cả các bài đăng của bạn cũng như blog của bạn (ví dụ: [bài đăng này] (http://blog.bdoughan.com/2010 /09/jaxb-collection-properties.html) cũng đề cập đến điều này). Luôn luôn siêu rõ ràng và cho điểm. Tôi cũng đang tìm kiếm một giải pháp đơn giản (tức là không liên quan đến một plugin xjc) mà sẽ cho phép chúng tôi chỉ tạo ra '@ XmlElementWrapper' bởi xjc. Sẽ rất gọn gàng để có thể khai báo một phần tử là "void" hoặc "pass-through" trong tệp .xsd, nghĩa là tất cả các phần tử con của nó sẽ tự động được cha mẹ chứa (hoặc cao hơn nếu cha mẹ cũng có lá cờ đó). –