Jenkins XmlParser报告未找到根节点属性的此类字段

时间:2019-06-11 14:20:27

标签: cordova jenkins jenkins-pipeline

我有一个项目,该项目具有以下XML文件(Cordova项目的config.xml)...

    <?xml version='1.0' encoding='utf-8'?>
    <widget android-versionCode="16" id="com.mycomp.myapp" ios-CFBundleVersion="15" version="1.3.0.b4" windows-packageVersion="1.2.6.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
        <name>My App</name>
        <description>My app description</description>
        <author>mycom.com.au</author>
           ....

我要做的就是读取根元素(version)的1.3.0.b4属性的值(为我提供字符串widget)。遵循示例here,该示例说要使用.@获取属性。

我的Jenkins文件脚本中包含以下内容...

        script {
              def xml = readFile "${env.WORKSPACE}/config.xml"
              def rootNode = new XmlParser().parseText(xml)
              def version = rootNode.@version
              echo 'version is...'
              echo version

但是当我运行它时,出现以下错误。

        org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.Node version
        at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
        at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetAttribute(SandboxInterceptor.java:436)
        at org.kohsuke.groovy.sandbox.impl.Checker$8.call(Checker.java:370)
        at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetAttribute(Checker.java:375)
        at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getAttribute(SandboxInvoker.java:37)

我已经尝试过rootNode.@version(如上所述)rootNode[0].@versionrootNode[3].@version,但没有任何效果。

有人对以上问题有任何想法吗?

预先感谢

[EDIT1]

如果我使用以下内容...

def xml = readFile "${env.WORKSPACE}/config.xml"
def rootNode = new XmlParser().parseText(xml)
def version = rootNode.text()
echo 'version is...'
echo version

它打印出My app description,这有点奇怪(它跳到了描述节点)

[EDIT2]

我尝试使用以下内容。

 def rootNode = new XmlSlurper().parse("${env.WORKSPACE}/config.xml")
 def version = rootNode.@'version'

但是我仍然遇到类似的错误...

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.slurpersupport.NodeChild version
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetAttribute(SandboxInterceptor.java:436)
at org.kohsuke.groovy.sandbox.impl.Checker$8.call(Checker.java:370)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetAttribute(Checker.java:375)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getAttribute(SandboxInvoker.java:37)
at com.cloudbees.groovy.cps.impl.AttributeAccessBlock.rawGet(AttributeAccessBlock.java:20)
at WorkflowScript.run(WorkflowScript:15)
at ___cps.transform___(Native Method)

如果我打电话给echo rootNode.text(),似乎只打印了主要,widget标签内的前3个标签的内容,即My AppMy app descriptionmycom.com.au

1 个答案:

答案 0 :(得分:1)

编辑:

我在还可以修改属性的情况下进行了更多测试,并发现在使用[]访问时,@属性选择器确实有效。看来这会导致您使用詹金斯(getAtputAt)认可的不同方法。

我们可以简单地使用

def rootNode = new XmlParser().parseText(xml)
println rootNode['@version']

原始答案:

关于使用脚本沙箱在groovy.util.Node对象上使用@选择器直接访问属性似乎存在一些错误。

一种解决方法是使用.attributes()方法获取完整的Map属性,并通过如下所示的键访问值:

def rootNode = new XmlParser().parseText(xml)
println rootNode.attributes()['version']

这将在第一次运行时失败,并提示您批准使用method groovy.util.Node attributes,但一旦获得批准就可以使用。