Android Kotlin中SimpleXML的@Path注解失效问题咨询
SimpleXML @Path注解在Android Kotlin中的可用性与正确用法
首先明确:SimpleXML的@Path注解在Android Kotlin环境下完全可用,你的问题出在注解的不完整配置上,导致@Path没有被正确解析。
问题分析
从你的输出"Here we are: null never"可以看出:
testelement解析为null,说明没有找到firstlevel/secondlevel/testelement节点one拿到了根节点的never,而不是firstlevel/secondlevel/one的always,这说明你添加的@Path("firstlevel/secondlevel")没有生效,SimpleXML还是在根节点下查找这些字段。
原因在于:Kotlin数据类中,你为字段(@field:)和构造函数参数(@param:)都添加了@Element/@ElementList注解,但只在字段上添加了@Path注解,参数上没有。SimpleXML在处理Kotlin数据类时,会优先通过构造函数注入值,所以参数上缺少@Path会导致路径配置被忽略。
修正后的代码
调整Baseobj类
把@Path注解同时添加到构造函数参数上:
@Root(name = "start", strict = false) data class Baseobj constructor( @Path("firstlevel/secondlevel") @field:ElementList(name = "testlist", inline = true, required = false) @param:ElementList(name = "testlist", inline = true, required = false) @param:Path("firstlevel/secondlevel") var testlist: List<Testlist>? = listOf(), @Path("firstlevel/secondlevel") @field:Element(name = "testelement", required = false) @param:Element(name = "testelement", required = false) @param:Path("firstlevel/secondlevel") var testelement: String? = null, @Path("firstlevel/secondlevel") @field:Element(name = "one", required = false) @param:Element(name = "one", required = false) @param:Path("firstlevel/secondlevel") var one: String? = null )
规范类名(可选但建议)
Kotlin类名遵循首字母大写的规范,建议把testlist类名改为Testlist:
@Root(strict = false, name = "testlist") data class Testlist constructor( @field:Element(required = false, name = "title") @param:Element(required = false, name = "title") var title: String? = null, @field:Element(required = false, name = "active") @param:Element(required = false, name = "active") var active: String? = null )
测试验证
修改后重新运行你的测试代码,应该会输出预期结果:
Here we are: 1 always
额外注意事项
- 确保Retrofit和SimpleXML Converter的版本一致(你使用的2.4.0版本是兼容的)
@Path的路径格式要正确,使用/分隔层级,严格对应XML中的节点嵌套关系- 对于更复杂的XML结构,
@Path支持XPath风格的灵活写法,比如使用通配符firstlevel/*/secondlevel匹配任意中间节点
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

