使用SimpleXml解析xml数据<二>

上一篇讲了如何将一个包含了对象的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

下一篇:较复杂的xml解析,使用SimpleXml解析xml数据<三>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值