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
相关产品推荐
相关产品推荐

