gpath 从具有相同名称的对象访问数据
gpath accessing data from objects with identical names
我正在使用 gpath 来解析 xml。我想从 stat 对象中提取 pass/fail 值。我遇到的问题是对象被组合在一起。我无法单独访问它们。
这是我正在处理的数据。
<robot>
<statistics>
<total>
<stat fail="28" pass="10">Critical Tests</stat>
<stat fail="28" pass="10">All Tests</stat>
</total>
</statistics>
</robot>
检查 groovy 在这些对象中看到的内容时
*打印 (stats.size()) returns 1
打印 (stats.stat['@pass]) returns 1010
澄清统计信息是该级别的 gpath 对象。
它似乎只是将两个不同的"stats"
连接起来
谢谢!
编辑:
这是我现在拥有的代码。
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']
}
}
考虑以下示例:遍历 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
或者你可以这样做:
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]
我正在使用 gpath 来解析 xml。我想从 stat 对象中提取 pass/fail 值。我遇到的问题是对象被组合在一起。我无法单独访问它们。
这是我正在处理的数据。
<robot>
<statistics>
<total>
<stat fail="28" pass="10">Critical Tests</stat>
<stat fail="28" pass="10">All Tests</stat>
</total>
</statistics>
</robot>
检查 groovy 在这些对象中看到的内容时
*打印 (stats.size()) returns 1
打印 (stats.stat['@pass]) returns 1010
澄清统计信息是该级别的 gpath 对象。
它似乎只是将两个不同的"stats"
连接起来谢谢!
编辑:
这是我现在拥有的代码。
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']
}
}
考虑以下示例:遍历 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
或者你可以这样做:
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]