XML标签迭代处理异常:set4置空后输出<NameList/>问题排查
解决XML处理后输出
<NameList/>的异常问题 问题分析
原代码的核心问题在于,处理entry为set4的<Name>节点时,仅将对象属性设为null但未从列表中移除该节点,后续XML序列化逻辑因对象核心属性为空,错误地将所有节点剔除,最终输出空的<NameList/>。同时使用forEach直接修改原列表元素的方式,容易引发序列化时的意外行为。
解决方案
正确思路是:对符合条件的节点做属性修改,直接过滤掉不需要保留的节点,生成新的处理后列表,避免修改原列表带来的副作用。
修正后的代码如下:
import java.util.List; import java.util.stream.Collectors; // 假设date值已预先定义为"2022-03-03" List<Name> processedNameList = nameList.stream() // 处理set3场景,添加date属性对应XML标签 .map(name -> { if ("set3".equals(name.getNameType().getEntry())) { name.setDate("2022-03-03"); } return name; }) // 过滤掉entry为set4的节点,不保留在结果列表中 .filter(name -> !"set4".equals(name.getNameType().getEntry())) .collect(Collectors.toList());
代码说明
- map操作:遍历每个
<Name>节点,当entry值为set3时,为节点添加date属性,对应XML中的<date>标签。 - filter操作:直接移除
entry值为set4的<Name>节点,确保最终结果仅保留需要的节点。 - collect生成新列表:通过
Collectors.toList()生成处理后的新列表,彻底避免修改原列表导致的序列化异常。
使用该代码处理后,序列化得到的XML会与预期完全一致:仅保留带有<date>标签的test1节点,test2对应的节点被直接剔除。
内容的提问来源于stack exchange,提问作者Futuregeek
相关产品推荐
相关产品推荐

