前言
在开发中, 一般都使用json解析, 但在最近搞的一个项目中, 需要接入固有的老接口,必须用xml进行解析. 搜索网上关于xml解析的文章不多, 也不够详细, 所以在经过一系列采坑之后, 我决心贡献自己的微薄经验. retrofit自带的json解析是GsonConverterFactory, xml解析时需替换为SimpleXmlConverterFactory, 此项目我采用了retrofit + rxjava2 + dagger2 + mvp + xml
准备工作:建议先使用postman测试接口
本文侧重于介绍xml解析
1、依赖库
compile('com.squareup.retrofit2:converter-simplexml:2.3.0') {
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
}
2、请求体实例
可以看到根节点为soap:Envelope, 第二层节点有soap:Header和soap:Body; 在soap:Header内部包含两层节点为kios:kioskSoapHeader以及最内层两个元素; 在soap:Body内部也包含两层节点为kios:assignRoom和其内部AssignRoom
以下为soap:Envelope节点写法
@Root(name = "soap:Envelope", strict = false)
@NamespaceList({
@Namespace(reference = "http://www.w3.org/2003/05/soap-envelope", prefix = "soap"),
@Namespace(reference = "http://kunlun.shijinet.cn/project/kiosk/", prefix = "kios")
})
@Default
@Order(elements = {
"soap:Header/kios:kioskSoapHeader[1]/hardwareId",
"soap:Header/kios:kioskSoapHeader[1]/stationId",
"soap:Body/kios:assignRoom/AssignRoom"
})
public class AssignRoomParams {
public AssignRoomParams(String hardwareId, String stationId, AssignRoomKey assignRoom) {
this.hardwareId = hardwareId;
this.stationId = stationId;
this.AssignRoom = assignRoom;
}
@Element
@Path("soap:Header/kios:kioskSoapHeader[1]/")
public String hardwareId;
@Element
@Path("soap:Header/kios:kioskSoapHeader[1]/")
public String stationId;
@Element
@Path("soap:Body/kios:assignRoom/")
public AssignRoomKey AssignRoom;
}
因为xml请求时是无序的, 有可能造成soap:Body在soap:Header节点上部, 造成请求参数错误; 所以此处采用了@Order与@path结合, 是为了保证soap:Header和soap:Body的上下次序;