unmarshal时,Jaxb和Object类不从Xml获取值

时间:2014-04-07 11:30:44

标签: java xml jaxb xml-serialization

我遇到以下源代码问题。 在解组"简单"上课,属性"内容"从"内容"创建tag为null。我的意思是"内容"财产没有得到价值" 123456"来自xml。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Simple", propOrder = {
    "content"})
public class Simple extends Valor{

    @XmlElements({
        @XmlElement(name="content",type=String.class),
        @XmlElement(name="content",type=Integer.class),
    })
    protected Object content;

    //getters y setters
}

file.xml

<simple>
    <content>
        123456
    <content>
</simple>

勇气等级

@XmlSeeAlso({
Varios.class,
Simple.class,
Grilla.class
})
@XmlTransient
public abstract class Valor {
    public abstract String getValorString();
}

有什么想法? 提前谢谢!

为我所拥有的问题增加一些清晰度。如果我把Simple类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Simple", propOrder = {
"content"})
public class Simple extends Valor{

    @XmlElements({
        @XmlElement(name="content",type=String.class),
        @XmlElement(name="content",type=Integer.class),
    })
    protected Object content;

    //getters y setters
}

如果xml是:

<simple>
<content>
    123456
</content>
</simple>

输出是:

123456

但如果xml是:

<simple>
<content>
    Hi!!
</content>
</simple>

输出是:

null

现在,如果是Simple类,请按照以下代码交换XmlElements:

    @XmlElements({
        @XmlElement(name="content",type=Integer.class),
        @XmlElement(name="content",type=String.class)
    })
    protected Object content;

如果xml是:

<simple>
<content>
    123456
</content>
</simple>

输出是:

null

但如果xml是:

<simple>
    <content>
        Hi!!
    </content>
</simple>

输出是:

Hi!!

1 个答案:

答案 0 :(得分:1)

我还没有能够重现你所看到的。以下是我的尝试。

Java模型

<强>简单

以下是我为Simple课程实施的内容。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Simple", propOrder = {
    "content"})
public class Simple extends Valor{

    @XmlElements({
        @XmlElement(name="content",type=String.class),
        @XmlElement(name="content",type=Integer.class),
    })
    protected Object content;

    public Object getContent() {
        return content;
    }

    @Override
    public String getValorString() {
        throw new UnsupportedOperationException();
    }

    public void setContent(Object content) {
        this.content = content;
    }

}

演示代码

<强> input.xml中

下面是输入文档,其中content的关闭标记已更正。

<simple>
    <content>
        123456
    </content>
</simple>

<强>演示

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Simple.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource source = new StreamSource("src/forum22911170/input.xml");
        Simple simple = unmarshaller.unmarshal(source, Simple.class).getValue();

        System.out.println(simple.getContent());
    }

}

<强>输出

以下是运行演示代码的输出:

123456

<强>更新

您遇到的问题是@XmlElements注释中的两个选项都映射到同一个元素content。对于解组,JAXB将根据具有该名称的第一个@XmlElement处理该元素。在下面的情况下,它会始终将其视为String,它会颠倒它始终将其视为Integer的顺序。

@XmlElements({
    @XmlElement(name="content",type=String.class),
    @XmlElement(name="content",type=Integer.class),
})
protected Object content;

正确的用法是将它们映射到不同的元素,例如

@XmlElements({
    @XmlElement(name="FOO",type=String.class),
    @XmlElement(name="BAR",type=Integer.class),
})
protected Object content;