Вопрос:

gpath доступ к данным из объектов с одинаковыми именами

xml parsing groovy gpath

73 просмотра

2 ответа

65 Репутация автора

Я использую gpath для разбора XML. Я хочу получить значения pass / fail из объекта stat. Проблема, с которой я столкнулся, заключается в том, что объекты группируются вместе. Я не могу получить к ним доступ отдельно.

Это данные, с которыми я работаю.

<robot>
<statistics>
  <total>
    <stat fail="28" pass="10">Critical Tests</stat>
    <stat fail="28" pass="10">All Tests</stat>
  </total>
</statistics>
</robot>

при проверке, что заводной видит в этих объектах

* печать (stats.size ()) возвращает 1

печать (stats.stat ['@ pass]) возвращает 1010

для уточнения статистики есть объект gpath на уровне.

Похоже, просто объединить две разные "статистика"

Спасибо!

редактировать:

Вот код, который у меня есть сейчас.

def stats = robot.statistics.total
    println(stats.size())
    println(stats.stat['@pass'])
    for (int i = 0; i < stats.size(); i++) {
        println(stats[i].stat)
        if (stats[i].stat == "All Tests") {
            println('i am here')
            println(stats[i].stat['@pass'])
            int totalPass = stats[i].stat['@pass']
            int totalFail = stats[i].stat['@fail']
        }
    }
Автор: Drew Royster Источник Размещён: 22.08.2016 08:45

Ответы (2)


1 плюс

18019 Репутация автора

Решение

Рассмотрим следующий пример: перебираем statузлы (и вычисляем итоги):

def xml = """
<robot>
<statistics>
  <total>
    <stat fail="28" pass="10">Critical Tests</stat>
    <stat fail="28" pass="10">All Tests</stat>
  </total>
</statistics>
</robot>
"""

def robot = new XmlSlurper().parseText(xml)

int totalPass = 0
int totalFail = 0

robot.statistics.total.stat.each { statNode -> 
    println "processing: " + statNode.text()
    totalPass += (statNode.@'pass'.text() as int)
    totalFail += (statNode.@'fail'.text() as int) 
} 

println "totalPass: " + totalPass
println "totalFail: " + totalFail
Автор: Michael Easter Размещён: 22.08.2016 11:16

1 плюс

140824 Репутация автора

Или вы могли бы сделать:

def xmlText = """
<robot>
<statistics>
  <total>
    <stat fail="28" pass="10">Critical Tests</stat>
    <stat fail="28" pass="10">All Tests</stat>
  </total>
</statistics>
</robot>
"""

def xml = new XmlSlurper().parseText(xmlText)

def result = ['pass', 'fail'].collectEntries {
    [it, xml.statistics.total.stat.@"$it"*.text()*.asType(Integer).sum()]
}

assert result == [pass:20, fail:56]
Автор: tim_yates Размещён: 23.08.2016 08:56
Вопросы из категории :
32x32