如何在Retrofit XML请求的数组元素中添加属性?
解决Retrofit+SimpleXML中为数组父标签添加属性的问题
你遇到的核心问题是用SimpleXML注解生成SOAP请求时,没法把arrayType属性精准加到name_value_list标签上——之前的尝试要么把属性加到了根标签sug:set_entry,要么加到了每个item子标签,都不符合预期。这是因为@ElementArray注解本身不支持直接给生成的父标签添加属性,我们需要换一种思路:把name_value_list封装成一个独立的类来处理。
具体解决方案步骤:
- 创建
NameValueList类,专门封装数组父标签及其属性
这个类会直接映射name_value_list标签,我们可以在这里定义需要的arrayType和length属性,同时包裹item列表:
@Root(name = "name_value_list") public class NameValueList { @Attribute private String arrayType; @Attribute private int length; @ElementList(name = "item", inline = true) private List<NameValueListItem> items; // 构造方法自动计算length public NameValueList(String arrayType, List<NameValueListItem> items) { this.arrayType = arrayType; this.length = items.size(); this.items = items; } // 省略getter和setter方法 }
- 修改
CreateRequest类,替换@ElementArray为@Element引用NameValueList
原来的@ElementArray只能生成父标签但无法添加属性,现在换成引用我们新创建的类:
@Root(name = "sug:set_entry") public class CreateRequest { @Element(name = "session") private String param1; @Element(name = "module_name") private String param2; @Element(name = "name_value_list") private NameValueList param3; // 移除原有的arrayType属性,现在它属于NameValueList类 // 以下保留原有的getter和setter方法 public String getSessionId() { return param1; } public void setSessionId(String sessionId) { this.param1 = sessionId; } public String getModuleName() { return param2; } public void setModuleName(String moduleName) { this.param2 = moduleName; } public NameValueList getNameValueList() { return param3; } public void setNameValueList(NameValueList nameValueList) { this.param3 = nameValueList; } }
- 清理
NameValueListItem类,移除多余的arrayType属性
现在arrayType属于父标签,这个类只需要保留核心的name和value字段即可:
@Root(name = "item") public class NameValueListItem { @Element(name = "name") private String param1; @Element(name = "value") private String param2; public NameValueListItem(String name, String value) { this.param1 = name; this.param2 = value; } // 保留原有的getter和setter方法 public String getName() { return param1; } public void setName(String name) { this.param1 = name; } public String getValue() { return param2; } public void setValue(String value) { this.param2 = value; } }
修改后生成的XML输出:
调整完成后,生成的SOAP请求就会完全符合你的期望:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sug="http://www.sugarcrm.com/sugarcrm" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> <soapenv:Body> <sug:set_entry> <session>xsfsfsffsdfsdfwerdfsf</session> <module_name>Cases</module_name> <name_value_list length="2" arrayType="sug:name_value[]"> <item> <name>status</name> <value>Open</value> </item> <item> <name>description</name> <value>Testing</value> </item> </name_value_list> </sug:set_entry> </soapenv:Body> </soapenv:Envelope>
核心思路就是把需要添加属性的父标签单独封装成一个类,这样就能通过@Attribute注解精准控制父标签的属性,而不是依赖@ElementArray这种无法自定义父标签属性的注解。
内容的提问来源于stack exchange,提问作者bhaumiksoni
相关产品推荐
相关产品推荐

