Найдите максимальное значение атрибута с помощью Groovy XmlSlurper

Дан xml:

<d>
    <r1 dt="2011-06-10">
        <r11 dt="2012-07-10" />
        <r12 rdt="2011-10-11">
            <r121 dt="2010-05-13" />
        </r12>
    </r1>
    <r2>
        <r21 dt="2011-10-10"><n2 ddt="2012-11-31"/>dt</r21>
        <r22 dt="2013-07-10"><n2 ddt="2013-06-31"/>dt</r22>
        <r23 dt="2014-06-10"><n2 ddt="2014-03-31"/>dt</r23>
        <r24 dt="2015-06-10"><n2 ddt="2011-10-31"/>dt</r24>
    </r2>
</d>

Мне нужно найти значение среди атрибутов dt, rdt и ddt с максимальной датой, используя Groovy XmlSlurper. В данном примере это будет 2015-06-10. Предположим, что структура дерева xml и глубина неизвестны (варьируются). Можно ли сделать это с помощью onliner, или мне нужно сделать несколько итераций в моем коде?


person lospejos    schedule 02.08.2016    source источник


Ответы (1)


Предполагая, что s - это строка, содержащая xml:

def x = new XmlSlurper().parseText(s)

Затем это даст вам список всех значений атрибута dt

def list = x.depthFirst().findAll { it.@dt != "" }​.collect {it.@dt}​​​

вы можете использовать аналогичный фрагмент кода для получения списков всех rdt и ddt. Поместите их все в один список, а затем просто получите максимум, который вы можете сделать:

list.max { a, b -> 
    new Date().parse("yyyy-MM-dd", a.toString()) <=> new Date().parse("yyyy-MM-dd", b.toString())
} ​
person OsaSoft    schedule 02.08.2016
comment
Вы, вероятно, имели в виду list.max, когда писали l.max? В любом случае спасибо, все работало как шарм. - person lospejos; 02.08.2016
comment
@lospejos ха-ха, да, я использовал одну букву vars в заводной консоли для тестирования, а затем решил переименовать их для ответа. Думаю, я пропустил это, ура! - person OsaSoft; 02.08.2016
comment
Не могли бы вы предоставить код на случай, если мне нужно не просто максимальное значение даты (не простая строка), а ссылка на родительский узел, который содержит этот атрибут максимального значения даты? - person lospejos; 02.08.2016
comment
Список здесь будет списком экземпляров класса атрибутов slurpers (docs.groovy-lang.org/latest/html/gapi/groovy/util/). Итак, если вы хотите, чтобы родитель, скажем, первый, вы могли бы сделать list[0].parents(). - person OsaSoft; 02.08.2016
comment
К сожалению, groovy.lang.GroovyRuntimeException: parent() еще не реализован. Это также присутствует здесь: docs.groovy-lang.org/latest/html/api/groovy/util/slurpersupport/ - person lospejos; 02.08.2016
comment
Ух ты. Ну parent() вроде работает. list[0].parent()​.name()​ дает мне r1 - person OsaSoft; 02.08.2016
comment
Давайте продолжим это обсуждение в чате. - person lospejos; 02.08.2016