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

如何在Groovy中对XML的row节点按Field3文本排序?

解决XML节点按指定字段排序的问题

问题分析

你当前的代码存在几个关键问题:

  • 解析后的root本身就是<VqlQueryRestResult>节点,无需再通过root.VqlQueryRestResult获取
  • 直接调用children()会包含XML中的空白文本节点,应该精准定位到<data>下的<row>节点
  • 排序逻辑中it.item.Field3的写法错误,<row>节点直接包含<Field3>,无需item层级

正确实现代码

def xml = '''<VqlQueryRestResult><data>    <row>        <Field3>BBB</Field3>    </row>    <row>        <Field3>CCC</Field3>    </row>    <row>        <Field3>AAA</Field3>    </row></data></VqlQueryRestResult>'''

// 解析XML
Node root = new XmlParser().parseText(xml)
// 获取data节点
Node dataNode = root.data[0]
// 获取所有row节点并按Field3文本排序
List<Node> sortedRows = dataNode.row.sort { it.Field3.text() }
// 清空data节点原有子节点,添加排序后的row
dataNode.children().clear()
sortedRows.each { dataNode.append(it) }

// 输出格式化后的XML
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
println writer.toString()

代码说明

  1. 解析XML:使用parseText()直接解析XML字符串(如果是文件可改用parse())
  2. 定位节点:精准获取<data>节点,再提取其中的所有<row>节点
  3. 排序逻辑:以<row>下<Field3>的文本内容作为排序依据,默认是升序排列
  4. 替换节点:清空原<data>下的子节点,将排序后的<row>节点重新添加进去
  5. 格式化输出:使用XmlNodePrinter生成带缩进的格式化XML

输出结果

<VqlQueryRestResult>
  <data>
    <row>
      <Field3>AAA</Field3>
    </row>
    <row>
      <Field3>BBB</Field3>
    </row>
    <row>
      <Field3>CCC</Field3>
    </row>
  </data>
</VqlQueryRestResult>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:12:12