【问题标题】:JAXB Unmarshal a list of objectsJAXB 解组对象列表
【发布时间】:2014-02-25 13:23:34
【问题描述】:

我有以下要解组的 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;
    }
}

有效载荷应包含年份对象列表:

@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;

【问题讨论】:

  • 您能否发布更多代码,从您如何创建(或获取)“响应”参考开始?我怀疑 String (r) 实际上并不包含您认为它包含的内容(您是否尝试将其打印出来以查看它是否包含您的 XML?)。
  • @JStevenPerry 这篇文章中的 XML 几乎是我代码输出的副本。不过还是谢谢。

标签: java xml jaxb


【解决方案1】:

您的注释需要在属性(get 或 set 方法)而不是字段上进行。如果您希望将它们放在字段中(实例变量),您需要使用 @XmlAccessorType(XmlAccessType.FIELD) 注释您的类,就像您在 Year 类上一样。

更新

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

【讨论】:

  • 感谢您的回答,我都尝试过,但无济于事......但是,我觉得问题出在实际的数组列表上,而不是 Year 类。如果是年级,我不会只有一个空列表吗?
  • @ferics2 - 如果您填充对象模型并将其编组(将其写入 XML),那么它是什么样的?
  • 我认为你正在做一些事情 Blaise。调试的好技巧。我添加了我的结果作为对此问题的编辑。
【解决方案2】:

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

【讨论】:

  • 对不起,错字...列表更长,所以我删掉了一些,忘记在我的编辑中关闭标签。谢谢。
【解决方案3】:
  1. 已经提到过,XML 文件应该包含 &lt;/Payload&gt; 代替 &lt;Payload&gt; 在最后一行
  2. @XmlElement 应该高于属性,但不能在 Year 类中使用 getter:
    @XmlElement int Value;

【讨论】:

  • 我希望那是错误的。试了没用。但是,我很好奇元素标签何时应该越过属性与 getter 或 setter?我已经看到它是双向的。
【解决方案4】:

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) 添加到类中,以防止同时添加“值”和“值”元素。

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

“YearOutputTest”中还提供了登录到控制台 XML 并将其解析回来的测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多