1

XML があるとします。

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <level0 id="2" t="1">
        <level1 id="lev1id21" att1="2015-05-12" val="121" status="0" year="2015" month="05" />
        <level1 id="lev1id22" att1="2015-06-13" val="132" status="0" year="2015" month="06" />
        <level1 id="lev1id23" att1="2015-07-11" val="113" status="0" year="2015" month="08" />
        <level1 id="lev1id23" att1="2015-07-11" val="114" status="0" year="2015" month="07" />
    </level0>
</data>

条件によってノードを見つける必要があります(多くの兄弟level1を持つことができると仮定します):level0

  1. それぞれについて、level0最大値を持つすべての 'level1' ノードを見つけます ( yyyy-mm-dd のようにatt1解釈されます)。Date
  2. これらのノードの中から、slevel1として解釈される年と月の属性に最大値を持つノードを見つけますint

与えられた例では、="113" 値を持つノードvalが見つかることを期待しています。私はGPathの専門家ではないので、正しい Groovish ソリューションを見つけるのを手伝ってください。ありがとう。

4

2 に答える 2

1

今のところ、この解決策を見つけましたGroovish。これを行う方法が他にあるかどうか知りたいです。

def xml='''<?xml version="1.0" encoding="UTF-8"?>
<data>
    <level0 id="2" t="1">
        <level1 id="lev1id21" att1="2015-05-12" val="121" status="0" year="2015" month="05" />
        <level1 id="lev1id22" att1="2015-06-13" val="132" status="0" year="2015" month="06" />
        <level1 id="lev1id23" att1="2015-07-11" val="113" status="0" year="2015" month="08" />
        <level1 id="lev1id23" att1="2015-07-11" val="114" status="0" year="2015" month="07" />
    </level0>
</data>'''

def nodes = new XmlSlurper().parseText(xml).level0.level1.findAll {level1 ->
    level1.max {lev1->
        Date.parse('yyyy-MM-dd',lev1.@att1.toString())
    }
}
.each {level1 ->
    level1.max { lev1 ->
        lev1.@year.toString() as int
    }
}.max {level1 ->
    level1.@month.toString() as int
}.collect()

println "${nodes.count {it}}"

nodes.each { n ->
    println "val = ${n.@val}"
}
于 2016-08-11T21:03:43.103 に答える