我有以下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;
答案 0 :(得分:2)
您的注释需要使用属性(获取或设置方法)而不是字段。如果您希望将它们放在字段上(实例变量),则需要使用@XmlAccessorType(XmlAccessType.FIELD)
为您的课程添加注释,就像在Year
课程中一样。
<强>更新强>
不是在@XmlRootElement
上指定命名空间,而是需要利用包级别@XmlSchema
注释(在名为package-info
的类上)来匹配命名空间限定。
答案 1 :(得分:1)
尝试在结尾的Payload标记中添加/。
答案 2 :(得分:1)
</Payload>
代替
<Payload>
在最后但只有一行@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'中提供了一个登录到控制台并将其解析回来的测试