上一篇讲了如何将一个包含了对象的Xml文件转换成一个对象.
今天继续解析一个list和嵌套对象的解析.
首先解析一个list,xml文件如下:
result = "<GetPositionListResult>" +
" <PositionInfo>" +
" <ReqDegreeID>0</ReqDegreeID>" +
" <CompanyName>广州市隆慈医疗机械有限公司</CompanyName>" +
" <CompanyId>299712</CompanyId>" +
" </PositionInfo>" +
" <PositionInfo>" +
" <ReqDegreeID>1</ReqDegreeID>" +
" <CompanyName>广州市富强彩印有限公司</CompanyName>" +
" <CompanyId>299712</CompanyId>" +
" </PositionInfo>" +
"</GetPositionListResult>";
这是博主公司服务器返回的list数据格式.
格式比较简单,算比较标准的xml的list格式了.
需要解析这样的数据,我们需要建立两个实体类,一个是PositionList实体类,一个是Position实体类.
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.util.List;
/**
* Created by fancy on 2016/6/22.
*/
@Root
public class PositionList {
public PositionList() {
}
@ElementList(entry = "PositionInfo", inline = true)
private List<Position> PositionInfo;
public List<Position> getList() {
return PositionInfo;
}
public void setList(List<Position> list) {
this.PositionInfo = list;
}
@Override
public String toString() {
String s = "";
for (Position position : getList()) {
s += position.toString() + "\n";
}
return s;
}
}
这里需要注意的是PositionInfo的名字可以随意,但entry的名字,必须和xml的中的名字保持一致,才能正确解析,其次是,因为数据外只包裹了一层,所以需要使用inline=true
属性.
接下来建立Position实体类当然你也可以命名为PositionInfo
不过在这里名字不重要,重要的属性要对应,和上篇文章中提到的一样,如果在属性上添加required=false
,即使xml中不存在这样的字段,也不会报错.
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
/**
* Created by fancy on 2016/3/15 0015.
*/
@Root
public class Position {
@Element(required = false)
private String PositionId;
@Element(required = false)
private String CompanyId;
@Element(required = false)
private String PosLogo;
@Element(required = false)
private String PositionName;
@Element(required = false)
private String CompanyName;
@Element(required = false)
private String PosDate;
public Position(){}
@Override
public String toString() {
return "Position{" +
"PositionId='" + PositionId + '\'' +
", CompanyId='" + CompanyId + '\'' +
", PosLogo='" + PosLogo + '\'' +
", PositionName='" + PositionName + '\'' +
", CompanyName='" + CompanyName + '\'' +
", PosDate='" + PosDate + '\'' +
'}';
这里我把getter/setter都省略了,即使没有getter/setter方法同样能够注入成功.但是别的类就无法访问到了,这里为了让代码看上去简洁易懂一点,直接把它们都省略了.
上节写了一个解析的工具类,可以不做任何改动,直接拿来解析list.
解析调用代码如下:
PositionList list = (PositionList) XmlUtil.getXMLObject(result, PositionList.class);
对于对象中包裹对象的解析,就不细说了,和解析list类似,声明建立对应的实体类就可以直接解析了.
2016/6/24 补充
之前提到simple-xml解析对象时,xml元素与实体类中的属性必须一一对应,现在已经找到解决方案。
xml中有的元素,而实体类中没有, 解决方案,在实体类的@(Root)中加上strict = false
如 @Root(strict = false)
实体类中有,xml中没有,且声明为@Element的,在@Element中加上 required = false
即可,之前提到过。
如果在使用Simplexml的过程中有什么疑问,欢迎加群讨论:283272067