2

我正在从 SAX 解析器转换为 JAXB - 无法弄清楚如何将多个标记/属性值解组为单个(可比较的)Java POJO。

我有这样的xml文件:

<item validFrom="1950" validUntil="1980">
    <description>some text</description>
</item>

“validFrom”和“validUntil”值应该组成一个有效的“MutableRange”POJO(见下面的定义)。

我需要将其解组为的 Java Item 定义是:

@XmlRootElement
@XmlAccessorType(XmlAcccessType.FIELD)
public class Item {
    // ??? need help mapping this to be composed from "validFrom", "validUntil" attributes
    private MutableRange validRange;

    @XmlElement
    private String description;
}

// assume all other boilerplate code exists
public class MutableRange {
    private int lowerBound;
    private int upperBound;
}

我尝试使用适配器,但它没有同时捕获:“from”和“until”值,以便我创建 MutableRange 实例。我尝试使用@XmlMixed没有成功。

JAXB 规定的方法是什么?

一旦解决了这个问题,我将MutableRange使用 ( XmlAdapter) 进行扩展以作为包装器来创建 guava 的不可变 Range 对象,并将其映射validRange@XmlJavaTypeAdapter(MutableRange.class)

4

2 回答 2

1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

您可以使用 MOXy 的@XmlPath扩展来映射此用例:

@XmlRootElement
@XmlAccessorType(XmlAcccessType.FIELD)
public class Item {
    @org.eclipse.persistence.oxm.annotations.XmlPath(".")
    private MutableRange validRange;

    @XmlElement
    private String description;
}

了解更多信息

于 2013-04-09T15:57:59.467 回答
0

我会使用一些简单的东西:

public interface MutableRange() {
    public int getLowerBound();
    public int getUpperBound();
    public void setLowerBound(int lowerBound);
    public void setUpperBound(int upperBound);
}

@XmlRootElement(name = "item")
@XmlAccessorType(XmlAccessType.NONE)
public class Item {
    @XmlAttribute(name = "validFrom")
    private int validFrom;
    @XmlAttribute(name = "validUntil")
    private int validUntil;
    @XmlElement(name = "description")
    private String description;

    public MutableRange getValidRange() {
        return new MutableRange() {
            public int getLowerBound() { return validFrom; }
            public int getUpperBound() { return validUntil; }
            public void setLowerBound(int lowerBound) { validFrom = lowerBound; }
            public void setUpperBound(int upperBound) { validUntil = upperBound; }
        }
    }

    public String getDescription() {
       return description;
    }
}
于 2013-04-09T17:31:04.793 回答