我正在从远程主机检索XML文件,并使用XmlParser
对其进行解析。该文件的内容如下:
<?xml version="1.0" encoding="utf-8"?><Metrics> <Safety> <score>81.00</score> <Percentrules>98.00</Percentrules> </Safety> </Metrics>
当我在Groovy沙箱外部执行脚本时,可以通过以下方式检索得分值。
def report = readFile(file: 'Qualitycheck.xml')
def metrics = new XmlParser().parseText(report)
println metrics
double score = Double.parseDouble(metrics.Safety.score[0].value()[0])
但是,当我使用SCM执行脚本时,会得到以下信息:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.Node
即使我已安装Permissive-Script-Security-Plugin
并使用-Dpermissive-script-security.enabled=no_security
JVM选项启用了插件,问题仍然存在。这种方法有什么不同吗?没有其他方法引起问题。为什么?
修改
我决定使用XmlSlurper()
,并检索了值81.00
。但是结果是类型groovy.util.slurpersupport.NodeChildren
def metrics2 = new XmlSlurper().parseText(report)
def score = metrics2.Safety.score
print score
print score.getClass()
=> 81.0098.00
=> groovy.util.slurpersupport.NodeChildren
如何使用XmlSlurper
提取值81.00
并将其转换为double
?那会是一个很好的选择吗?
答案 0 :(得分:1)
具有“节点”和“节点列表”字段访问权限的脚本沙箱似乎存在一些问题。您可以按照以下方法解决此问题,虽然效果不好,但至少可以正常工作。
node() {
def xml = readFile "${env.WORKSPACE}/Qualitycheck.xml"
def rootNode = new XmlParser().parseText(xml)
print Double.parseDouble(rootNode.value()[0].value()[0].value()[0])
// Next line if position isnt fixed, can return an array
// if theres more than 1 with structure "Safety.score", [0] at the end takes the first.
print Double.parseDouble(rootNode.find{it.name() == "Safety"}.value().find{it.name() == "score"}.value()[0])
}
您还需要在“管理Jenkins”菜单的“进程内脚本批准”部分中批准以下签名。
method groovy.util.Node name
method groovy.util.Node value
method groovy.util.XmlParser parseText java.lang.String
new groovy.util.XmlParser
staticMethod java.lang.Double parseDouble java.lang.String
staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods find java.lang.Object groovy.lang.Closure