【发布时间】:2019-10-26 00:04:23
【问题描述】:
我有一个包含以下 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>
....
我要做的就是读取根元素 (widget) 的 version 属性的值(给我字符串 1.3.0.b4)。遵循示例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].@version 和rootNode[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。
【问题讨论】:
-
可能有一些沙盒限制了对某些内容的访问。有足够的权限你可以批准一些被阻止的东西,查看文档here
-
@DominikGebhart,是的,我确实遇到了问题,但最终按照您上面引用的确切文档克服了它们。对
def rootNode = new XmlParser().parseText(xml)的调用现在对我有用(不会引发异常)。只有当我添加def version = rootNode.@version行时,我才得到异常。例如,运行def text = xmlContents.text() + echo 'contents are...' + echo text确实为我输出了文本(只是不想要我想要的) -
@DominikGebhart 我尝试了上述两种方法,但仍然遇到类似的错误 - 添加到主要问题中作为 EDIT2 以便可以获取格式。 XML 文件似乎没有任何问题,所以真的不知道为什么它不适合我?
-
也试过
echo rootNode.parent().text()。但似乎仍然打印出前 3 个内部标签的内容。它似乎正在跳过外部的``标签,这是我所追求的
标签: cordova jenkins jenkins-pipeline