Groovy сортировка узлов дает неверный результат - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь отсортировать xml-файл в groovy, но при просмотре результата он сортируется не так, как я ожидал (по алфавиту).

Вот код

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 голосов
/ 06 июня 2019

Вы возвращаете массив с одним элементом, текстом в нем.

Вернуть только текст:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...