Groovy 2.4.21中rootNode.Person排序失效问题咨询
问题解析:Groovy XML排序中
rootNode.children().sort()与rootNode.Person.sort()的差异 结合Sean Reilly针对XML排序的解决方案,核心差异源于Groovy XML集合的类型特性:
关键原因
在Groovy 2.4.21中,rootNode.children()和rootNode.Person虽然内容相等,但它们与原XML结构的绑定逻辑完全不同:
rootNode.children()返回的是根节点的直接子节点集合,这个集合与原XML节点的子节点列表强绑定。调用sort(true)(参数true表示修改原集合)时,会直接调整根节点下子节点的实际顺序,最终同步到XML结构中,这也是Sean Reilly方案有效的核心原因。rootNode.Person返回的是XMLNodeList类型的视图集合——它只是从原XML中筛选出所有<Person>节点,但并不直接关联根节点的子节点顺序。调用sort(true)只会对这个视图内部的元素排序,不会修改原XML中根节点下的子节点排列,所以你看不到XML里的Person节点被排序。
实现期望效果的方法
如果想通过rootNode.Person实现排序,需要手动将排序后的节点替换根节点的子节点:
// 先获取排序后的Person节点列表 def sortedPersons = rootNode.Person.sort { it.attribute('name') } // 清空根节点原有子节点,再添加排序后的节点 rootNode.children().clear() rootNode.children().addAll(sortedPersons)
这样就能达到和rootNode.children().sort(true)一致的排序效果。
内容的提问来源于stack exchange,提问作者jimmy_blue
相关产品推荐
相关产品推荐

