我需要在我的管道中创建一个步骤来获取Xml文件并在其上更改特定元素(基于变量和其他构建输出),然后再进行下一步。
虽然我可以轻松地创建一个C#或Java程序,但我决定尝试在我的管道中添加一个新步骤并直接处理Xml。
根据这些帖子,我面临的问题是XmlSlurper
尚未列入白名单:
https://issues.jenkins-ci.org/browse/JENKINS-33024
XmlSlurper
太有问题,不会受到支持。 它对线程上下文类加载器问题很敏感,这可能会导致显然不相关的插件出现神秘错误。某些方法也不适合白名单。
目前我必须处理一些文件,这没关系。
Jenkins Pipeline Utility Steps已经提供了一些函数来读取和处理JSON。但XmlSlurper
或与此相关的任何内容都没有其他选择。
不幸的是我正在处理一些我无法更改为JSON的工具,并且由于XML仍在使用,是否有人知道XmlSlurper
的任何替代方案?
我宁愿不尝试手动处理这些XML,比如处理正则表达式。
答案 0 :(得分:0)
在groovy的共享库中将XML转换为json。我在src / org / config的共享库中有一个名为GroovyUtils的类。
package org.config
import groovy.text.SimpleTemplateEngine
import java.nio.charset.StandardCharsets
import groovy.json.JsonSlurper
import org.json.JSONObject
import org.json.XML
import java.util.ArrayList
import hudson.model.*;
public class GroovyUtils implements Serializable {
def engine = new SimpleTemplateEngine()
def config
def steps
def GroovyUtils(config, steps) {
this.config = config
this.steps = steps
}
def log(msg){
steps.println(msg)
}
def getFinalAttr(thingToSearchFor){
def fileContents = new File("YourXMLFile.xml").text;
def json = xmlToJson(fileContents);
def jsonObj = new JsonSlurper().parseText(json)
def foo = jsonObj["someAttr"].someArr["anotherArr"]
def bar = foo.find { it.name == thingToSearchFor }
return bar.finalAttr
}
def xmlToJson(input) {
JSONObject xmlJSONObj = XML.toJSONObject(input)
return xmlJSONObj.toString(2)
}
}
上面的关键方法是getFinalAttr(thingToSearchFor)。
对foo和bar局部变量的分配将取决于您的jsonObj的结构,但向您显示可以遍历它以获取所需的内容。