我是用Java处理XML的新手,但我使用的服务之一就是返回结果。到目前为止,我已经使用@XmlRootElement
处理将XML映射到POJO - 就像注释一样。但现在我完全不知道这个文件:
<?xml version="1.0" encoding="windows-1251"?>
<response>
<status>
<code>0</code>
</status>
<result>
<limit>2</limit>
...
<data>
<row0>
<ID>85427</ID>
<name>Default</name>
<siteID>40628</siteID>
... some elements
</row0>
</data>
</result>
</response>
到目前为止,我使用这些类将XML(“数据”节点除外)绑定到POJO:
@XmlRootElement(name="response")
public class Response {
private Status status;
private String result;
public Status getStatus() {
return status;
}
@XmlElement(name = "status")
public void setStatus(Status status) {
this.status = status;
}
public String getResult() {
return result;
}
@XmlElement(name ="result")
public void setResult(String result) {
this.result = result;
}
}
@XmlRootElement(name = "status")
public class Status {
private String ID;
private String code;
private String error;
public String getID() {
return ID;
}
@XmlElement(name = "ID")
public void setID(String ID) {
this.ID = ID;
}
public String getCode() {
return code;
}
@XmlElement(name = "code")
public void setCode(String code) {
this.code = code;
}
public String getError() {
return error;
}
@XmlElement(name = "error")
public void setError(String error) {
this.error = error;
}
}
但是现在我需要将内容绑定为元素集合。我查找了示例,并且每个人都使用特定标记来定义集合项的根元素,但在本文档中,根标记将为<row0>
,<row1>
等。
我使用Jackson,如果我理解正确的话,使用JAXB注释来定义XML到POJO绑定规则。那么这笔交易是否可以通过这种方式解决,或者我必须以DOM风格操作这个文档?
答案 0 :(得分:0)
您可以使用以下内容解决问题:
创建代表您的<row0>,<row1>
等的Row类,并像使用JAXB一样将其映射。
然后创建一个扩展XmlAdapter<List<Row>,List<Element>>
的类,并定义marshall和unmarshall的摘要方法。
以下是一些帮助您的Javadoc:
XmlAdapter:http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/adapters/XmlAdapter.html
元素:http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Element.html
然后创建一个Data类:
public class Data{
private List<Row> rows;
public List<Row> getRows() {
return rows;
}
@XmlAnyElement
@XmlJavaTypeAdapter(MyRowsAdapter.class)
public void setRows(List<Row> result) {
this.rows = rows;
}
}
然后,您可以将此映射添加到Response类:
private Data data;
public Data getData() {
return data;
}
@XmlElement(name="data")
public void setData(Data data) {
this.data = data;
}
请注意,要使此解决方案有效,您的<data>
元素必须只包含您的行等元素。
此外,您不能使用@XmlElementWrapper而不是使用Data类,因为JAXB中的一个错误会导致不兼容的@XmlElementWrapper和@XmlJavaTypeAdapter:https://java.net/jira/browse/JAXB-787