Jaxb - 如何在同一个类中编写具有不同名称的xml元素

时间:2015-10-27 12:48:41

标签: jaxb

我有一个项目列表,这些项目应该作为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>

1 个答案:

答案 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 */ }

并将其用作文本框元素的类型,同样用于复选框和下拉列表。