我有一个项目列表,这些项目应该作为xml文档中具有不同名称的元素进行编组。每个项目都有String
字段type
,并且根据该字段的值,我知道应该在xml中写入哪些元素名称。所以在我的根元素中,我有List<Item> items
,我可以使用@XmlElements
注释,但是如何告诉Jaxb在编组时它应该使用哪个名称?
@XmlRootElement
public class Form {
@XmlElements({
@XmlElement(name="textbox", type=Item.class),
@XmlElement(name="checkbox", type=Item.class),
@XmlElement(name="dropdown", type=Item.class)
})
private List<Item> items;
}
我希望结果如下:
<form>
<textbox ...> ... </textbox>
<checkbox ...> ... </checkbox>
<textbox ...> ... </textbox>
<textbox ...> ... </textbox>
<dropdown ...> ... </dropdown>
...
</form>
答案 0 :(得分:0)
如果你坚持使用相同的类型(而不是不同的子类型,每个子类型都不会增加基本类型),那么你会有点麻烦。
@XmlElementRefs({ @XmlElementRef(name = "bluebox", type = JAXBElement.class, required = false), @XmlElementRef(name = "textbox", type = JAXBElement.class, required = false), @XmlElementRef(name = "dropdown", type = JAXBElement.class, required = false) }) protected List> textboxOrCheckboxOrDropdown; public List> getTextboxOrCheckboxOrDropdown() { if (textboxOrCheckboxOrDropdown == null) { textboxOrCheckboxOrDropdown = new ArrayList>(); } return this.textboxOrCheckboxOrDropdown; }
您的ObjectFactory可能包含
等方法@XmlElementDecl(namespace = "", name = "textbox", scope = Form.class) public JAXBElement createFormTextbox(BoxType value) { return new JAXBElement(_FormTextbox_QNAME, BoxType.class, Form.class, value); }
同样适用于复选框和下拉列表。
如果您宣布
,事情会更容易一些class TextBox extends Item { /* empty */ }
并将其用作文本框元素的类型,同样用于复选框和下拉列表。