cordova - Jenkins XmlParser 报告 No such field found for attribute for root node

标签 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>
           ....

我要做的就是读取根元素(小部件)。以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但没有任何效果。

上面有什么问题?

编辑 1

如果我使用以下内容:

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 这有点奇怪(它会跳到描述节点)

编辑 2

我尝试使用以下方法:

 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 个标签的内容,即我的应用我的应用描述mycom.com.au.

最佳答案

编辑:

我在能够修改属性的上下文中进行了更多测试,发现在使用 [] 访问时,属性的 @ 选择器确实有效。似乎这会导致在后台使用不同的方法,您可以在 jenkins (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']

这将在第一次运行时失败,并提示您批准使用 方法 groovy.util.Node 属性,但一旦批准就可以工作。

关于cordova - Jenkins XmlParser 报告 No such field found for attribute for root node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56545854/

相关文章:

ios - 带有 xcode 5.1 的 cordova 3.4 不会使用最新的文件传输插件构建

jenkins - 如何在没有管道支持的情况下使用 Jenkins 插件?

Jenkins Pipeline currentBuild 持续时间总是返回 0

jenkins - 使用 Jenkins 中的声明式管道步骤在并行步骤中分配变量

android - phonegap 地理位置总是在超时时失败

html - 在 html 页面上引用 cordova.js

ios - 无法存档更新的 iOS PhoneGap 应用程序

Jenkins 与 Jira 的集成问题

Windows docker build 警告 non-windows docker host

android - Jenkins 无法存档调试 apk