节点的Groovy排序提供了错误的结果

时间:2019-06-06 12:41:49

标签: sorting groovy

我正在尝试对groovy中的xml文件进行排序,但是当查看结果时,它的排序却不符合我的预期(按字母顺序排序)。

这是代码

import groovy.json.JsonSlurper;
import groovy.json.JsonBuilder;
import groovy.util.OrderBy;
import groovy.xml.XmlUtil;


String xmlString = "<root>";
xmlString = xmlString + "<record><item>CBCP3030cmackham************00000036</item><field>CBCP</field></record>";
xmlString = xmlString + "<record><item>CBCP3030cmackham************00000036</item><field>CBCP</field></record>";
xmlString = xmlString + "<record><item>CASHser@mdgrathnicol.co*302000000143</item><field>CASH</field></record>";
xmlString = xmlString + "<record><item>CASH2001724*************302000000143</item><field>CASH</field></record>";
xmlString = xmlString + "</root>";

def rootsFTPData = new XmlParser().parseText(xmlString);
rootsFTPData.children().sort(true) {
  [it.item.text()]
};

def xmlStringTemp = XmlUtil.serialize(rootsFTPData);
println xmlStringTemp;

这是输出

<?xml version="1.0" encoding="UTF-8"?><root>
  <record>
    <item>CASH2001724*************302000000143</item>
    <field>CASH</field>
  </record>
  <record>
    <item>CBCP3030cmackham************00000036</item>
    <field>CBCP</field>
  </record>
  <record>
    <item>CBCP3030cmackham************00000036</item>
    <field>CBCP</field>
  </record>
  <record>
    <item>CASHser@mdgrathnicol.co*302000000143</item>
    <field>CASH</field>
  </record>
</root>

我会期望的

CASH2001724*************302000000143
CASHser@mdgrathnicol.co*302000000143
CBCP3030cmackham************00000036
CBCP3030cmackham************00000036

我的代码有什么问题,或者如何实现正确的排序。

1 个答案:

答案 0 :(得分:0)

您将返回一个包含单个项目的数组,其中包含文本。

仅返回文本:

rootsFTPData.children().sort(true) { it.item.text() }

您现在正在做的是这个

rootsFTPData.children().sort(true) { [it.item.text()] }

这会将文本放入数组中(该数组包含一个元素,即文本),因此Groovy会对它进行排序,但是对数组进行排序。您想对文本进行排序,所以返回文本。不是数组。

不相关,但是不需要像Groovy中那样进行字符串连接:

import groovy.xml.XmlUtil

String xmlString = """
<root>
  <record><item>CBCP3030cmackham************00000036</item><field>CBCP</field></record>
  <record><item>CBCP3030cmackham************00000036</item><field>CBCP</field></record>
  <record><item>CASHser@mdgrathnicol.co*302000000143</item><field>CASH</field></record>
  <record><item>CASH2001724*************302000000143</item><field>CASH</field></record>
</root>
"""

def rootsFTPData = new XmlParser().parseText(xmlString)
rootsFTPData.children().sort(true) { it.item.text() }

def xmlStringTemp = XmlUtil.serialize(rootsFTPData)
print xmlStringTemp

这将产生:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <record>
    <item>CASH2001724*************302000000143</item>
    <field>CASH</field>
  </record>

  <record>
    <item>CASHser@mdgrathnicol.co*302000000143</item>
    <field>CASH</field>
  </record>

  <record>
    <item>CBCP3030cmackham************00000036</item>
    <field>CBCP</field>
  </record>

  <record>
    <item>CBCP3030cmackham************00000036</item>
    <field>CBCP</field>
  </record>    
</root>