我可以在JAXB中建模一个有时包含其他元素且有时包含直接数据的元素

时间:2016-02-09 10:55:00

标签: java xml jaxb

Web服务有时会提供

形式的元素
<artist>
<name>name</name>
</artist>

有时候喜欢

<artist>name</artist>

我无法控制网络服务,因此无法更改此

我将结果读入JAXB模型。是否可以在JAXB中对此不一致进行建模,我的模型目前仅代表第一个。

1 个答案:

答案 0 :(得分:4)

如果您能够在将Web服务消息传递给JAXB之前拦截它,您可以将其(例如使用XSLT)转换为适用于当前JAXB模型的形式。如果您不能这样做,那么处理起来有点难看,但您可以尝试将这两种消息形式建模为混合内容,从而允许您将内容表示为字符串或包含该字符串的元素。

例如:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
@XmlRootElement(name = "artist")
public class Artist {

    @XmlElementRef(name = "name", type = JAXBElement.class, required = false)
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }
}

@XmlRegistry
public class ObjectFactory {

    private final static QName NAME_QNAME = new QName("", "name");
    public ObjectFactory() {}

    public Artist createArtist() {
        return new Artist();
    }

    @XmlElementDecl(namespace = "", name = "name", scope = Artist.class)
    public JAXBElement<String> createArtistName(String value) {
        return new JAXBElement<String>(NAME_QNAME, String.class, Artist.class, value);
    }
}