java - 我可以在 JAXB 中对有时包含其他元素有时包含直接数据的元素进行建模吗

标签 java xml jaxb

网络服务有时会提供表单中的元素

<artist>
<name>name</name>
</artist>

有时喜欢

<artist>name</artist>

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

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

最佳答案

如果您能够在将 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);
    }
}

关于java - 我可以在 JAXB 中对有时包含其他元素有时包含直接数据的元素进行建模吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290191/

相关文章:

java - 如何将欧元符号编码为 android XML 文件中的 strings.xml

java - 当前缀分隔符和后缀分隔符不同时,分割字符串的最佳方法是什么?

java - JAXB - 带有 java 注释的编码

java - JAXB : XmlElementWrapper nested nodes

java - 使用 Spring Boot 2.0.2 进行 OpenTracing 不会在 Jaeger 中产生任何跟踪

java - JsonProperty 所需值可以是有条件的吗?

Android - 可选择的 recyclerview 项目,其中包含可选择的 View

c# - 对象序列化和派生类;控制 xml 输出

java - JAXB 编码(marshal) setProperty com.sun.xml.bind.CharacterEscapeHandler

java - 如何从驻留在 OSGi 包中的类获取 JNI 中的 jclass