JAXB解组对象列表

时间:2014-02-01 21:36:06

标签: java xml jaxb

我有以下XML,我试图解组:

<ListOfYear>
    <Requests/>
    <Payload>
        <Year>
            <Value>2013</Value>
        </Year>
        <Year>
            <Value>2012</Value>
        </Year>
        <Year>
            <Value>2011</Value>
        </Year>
        <Year>
            <Value>2010</Value>
        </Year>
        <Year>
            <Value>2009</Value>
        </Year>
        <Year>
            <Value>2008</Value>
        </Year>
    </Payload>
</ListOfYear>

我的java类看起来像这样:

@XmlRootElement(name = "ListOfYear")
public class YearOutput {

    @XmlElementWrapper(name = "Payload")
    @XmlElement(name = "Year")
    private ArrayList<Year> Payload;

    public ArrayList<Year> getPayload() {
        return Payload;
    }

    public void setPayload(ArrayList<Year> payload) {
        Payload = payload;
    }
}

Payload应包含年份对象列表:

@XmlRootElement(name = "Year")
@XmlAccessorType(XmlAccessType.FIELD).
public class Year {

    @XmlElement(name = "Value")
    int Value;

    public int getValue() {
        return Value;
    }

    public void setValue(int value) {
        Value = value;
    }
}

我使用以下代码解组XML:

String r = response.getEntity(String.class);
JAXBContext jaxbContext = JAXBContext.newInstance(YearOutput.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

YearOutput output = (YearOutput) unmarshaller.unmarshal(new StringReader(r));

我得到一个输出对象就好了,有效负载对象总是为空。我已经使用我的XML注释尝试了几种不同的方法,并且无法获得任何工作。任何帮助将不胜感激。

修改 我认为名称空间无关紧要,所以我没有发布那部分代码。但是@Blaise Doughan建议我整理我的模型,看来我的命名空间可能会导致问题......

以下是我需要的完整XML:

<ListOfYear xmlns="http://something.com/">
    <Requests/>
    <Payload>
        <Year>
            <Value>2013</Value>
        </Year>
        <Year>
            <Value>2012</Value>
        </Year>
        <Year>
            <Value>2011</Value>
        </Year>
        <Year>
            <Value>2010</Value>
        </Year>
        <Year>
            <Value>2009</Value>
        </Year>
        <Year>
            <Value>2008</Value>
        </Year>
    </Payload>
</ListOfYear>

这是我的完整模特:

@XmlRootElement(name = "ListOfYear", namespace = "http://something.com/")
public class YearOutput {

    @XmlElementWrapper(name = "Payload")
    @XmlElement(name = "Year")
    private ArrayList<Year> Payload;

    public ArrayList<Year> getPayload() {
        return Payload;
    }

    public void setPayload(ArrayList<Year> payload) {
        Payload = payload;
    }
}

现在当我整理我的模型时,我得到了:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:ListOfYear xmlns:ns2="https://something.com/">
    <Payload>
        <Year>
            <Value>2008</Value>
        </Year>
    </Payload>
</ns2:ListOfYear>

那么我的命名空间出错了什么?

修改 添加package-info.java后,一切都很完美!

@XmlSchema(
        namespace = "https://something.com/",
        elementFormDefault = XmlNsForm.QUALIFIED)
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

4 个答案:

答案 0 :(得分:2)

您的注释需要使用属性(获取或设置方法)而不是字段。如果您希望将它们放在字段上(实例变量),则需要使用@XmlAccessorType(XmlAccessType.FIELD)为您的课程添加注释,就像在Year课程中一样。

<强>更新

不是在@XmlRootElement上指定命名空间,而是需要利用包级别@XmlSchema注释(在名为package-info的类上)来匹配命名空间限定。

答案 1 :(得分:1)

尝试在结尾的Payload标记中添加/。

答案 2 :(得分:1)

  1. 已经提到过,XML文件应该包含 </Payload> 代替 <Payload> 在最后但只有一行
  2. @XmlElement应该高于属性,但不应该是Year类中的getter:
    @XmlElement int Value;

答案 3 :(得分:1)

缺少getValue上XmlElement注释中的元素名称。 JAXB默认行为是getValue表示'value'元素,表示'Value'。添加注释 @XmlElement(name =“Value”)

将其修复为您的其他代码

@XmlRootElement(name = "Year")
public static Year {

...

    @XmlElement(name="Value")
    public int getValue() {
       return Value;
   }

...

}

如果您还要编组,我建议将 @XmlAccessorType(XmlAccessType.NONE)添加到类中,以防止同时添加“value”和“Value”元素。

请参阅包'wicketstuff / enteam / wicket / examples14 / mixed'的完整工作代码 https://repo.twinstone.org/projects/WISTF/repos/wicket-examples-1.4/browse/

在'YearOutputTest'中提供了一个登录到控制台并将其解析回来的测试