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

XML解组时While循环未遍历完整字符串,仅返回首个list节点

问题分析与解决

核心问题

你这段代码的问题出在while循环逻辑上:找到第一个<list>起始元素就执行break跳出循环,导致后续的<list>元素完全没被处理,这是只返回第一个结果的直接原因。另外,你的实体类大概率是把list定义成了单个对象类型,而非集合类型,这也是最终结果没以数组形式返回的原因。

解决步骤

1. 修正实体类定义

确保根实体类中的list字段为集合类型(比如List<Item>),示例如下:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
public class Root {
    private List<Item> list;

    @XmlElement(name = "list")
    public List<Item> getList() {
        return list;
    }

    public void setList(List<Item> list) {
        this.list = list;
    }
}

// 单个list元素对应的实体类
public class Item {
    private String name;
    private String assign;

    @XmlElement(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name = "assign")
    public String getAssign() {
        return assign;
    }

    public void setAssign(String assign) {
        this.assign = assign;
    }
}

2. 调整XML解析循环逻辑

去掉循环中的break,改为遍历所有<list>元素,逐个解组后添加到集合中:

JAXBContext jaxbContext = JAXBContext.newInstance(Root.class, Item.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
List<Item> itemList = new ArrayList<>();

while(xsr.hasNext()){   
    if(xsr.isStartElement() && "list".equals(xsr.getLocalName())) {           
        // 解组当前的list元素
        Item item = unmarshaller.unmarshal(xsr, Item.class).getValue();
        itemList.add(item);
    }       
    xsr.next(); 
}

// 组装根对象返回
Root root = new Root();
root.setList(itemList);

效果验证

修改后,接口返回结果会符合预期:

{
  "list": [
    {
      "name": "Ben_1",
      "assign": "trac"
    },
    {
      "name": "John",
      "assign": "task"
    }
  ]
}

内容的提问来源于stack exchange,提问作者JustAnotherCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:48:34