【问题标题】:JAXB unmarshal list element by elementJAXB 逐个元素解组列表
【发布时间】:2014-10-16 21:22:54
【问题描述】:

我需要一些帮助来解组一些 XML。特别是在解组元素列表时。请参阅以下示例:

@XmlRootElement(name="element")
public class Element
{
    private ArrayList<Element> children;

    public ArrayList<Element> getChildren() {
        return children;
    }

    @XmlElementWrapper(name = "children")
    @XmlElement(name = "element")
    public void setChildren(ArrayList<Element> children) {
        this.children = children;
    }
}

这将完美地解组列表,但我需要的是解组所有子元素逐个元素并通过一些“addElement”方法添加它们:

    public void addElement(Element element) {
        children.add(element)
    }

这可以通过一些简单的注释magic来实现吗?当然我可以遍历元素并调用“addElement”。

【问题讨论】:

  • 让我猜猜,您有一个巨大的 XML 并且不想将其全部解组,而是将其“流式传输”给某个接收者?往StAX的方向看(可以和JAXB很好用)。
  • 不错的猜测,但没有:P 这背后没有疯狂的用例。只是想知道这是否可能,我在网上找不到任何东西。
  • 可惜了。这是一个很好的用例。

标签: java xml jaxb unmarshalling


【解决方案1】:

你可以简单地假装你的 appender 是一个 setter。

Example:

@XmlRootElement(name = "element")
public class Element {
    private List<Element> children = new LinkedList<Element>();

    @XmlTransient
    public List<Element> getChildren() {
        return children;
    }

    @XmlElement(name = "element")
    public void setChild(Element child) {
        this.children.add(child);
    }

    private String value;

    @XmlAttribute
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

每次遇到element 元素时,JAXB 都会调用setter。这会将未编组的元素添加到列表中。列表 getter 是 @XmlTransient 以避免被 JAXB 处理。

更新

我忘了补充一点,这不适用于 @XmlWrapperElement,因为它需要一个集合属性。

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多