如何在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()
代码说明
- 解析XML:使用
parseText()直接解析XML字符串(如果是文件可改用parse()) - 定位节点:精准获取
<data>节点,再提取其中的所有<row>节点 - 排序逻辑:以
<row>下<Field3>的文本内容作为排序依据,默认是升序排列 - 替换节点:清空原
<data>下的子节点,将排序后的<row>节点重新添加进去 - 格式化输出:使用
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
相关产品推荐
相关产品推荐

