You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Retrofit XML请求的数组元素中添加属性?

解决Retrofit+SimpleXML中为数组父标签添加属性的问题

你遇到的核心问题是用SimpleXML注解生成SOAP请求时,没法把arrayType属性精准加到name_value_list标签上——之前的尝试要么把属性加到了根标签sug:set_entry,要么加到了每个item子标签,都不符合预期。这是因为@ElementArray注解本身不支持直接给生成的父标签添加属性,我们需要换一种思路:把name_value_list封装成一个独立的类来处理。

具体解决方案步骤:

  1. 创建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方法
}
  1. 修改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;
    }
}
  1. 清理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:26:33