无法在jenkins管道中解析xml文件

时间:2018-03-07 10:01:19

标签: xml jenkins groovy jenkins-pipeline

我有简单的xml文件,我需要在管道中进行解析。

<?xml version="1.0" encoding="UTF-8" standalone="true"?>

<AS Name="123">
    <Config Name="Configuration1">
        <Servers>
            <Server Name="server1"/>
            <Server Name="server2"/>
            <Server Name="server3"/>
            <Server Name="server4"/>
         </Servers>
    </Config>
</AS>

我需要提取所有服务器的值&#39;名称变成变量。 所以我使用下面的代码,但只得到&#34;未分类的字段java.lang.string配置&#34;例外

deleteDir()
stage("upload") {
    def inputFile = input message: 'Upload file', parameters: [file(name: 'parameters.xml')]
    new hudson.FilePath(new File("$workspace/parameters.xml")).copyFrom(inputFile)
    inputFile.delete()
}

stage ("parse")
{
    def xml = readFile "${env.WORKSPACE}/parameters.xml"
    def config = new XmlParser().parseText(xml)



    config.Config.Servers.Server.each{
        println it.@Name
    }

}

XMLSlurper也没有帮助。 我做错了什么?

UPD:使用noncps重写管道,但它没有给出结果

node
{

    deleteDir()
    stage("upload") {
        def inputFile = input message: 'Upload file', parameters: [file(name: 'parameters.xml')]
        new hudson.FilePath(new File("$workspace/parameters.xml")).copyFrom(inputFile)
        inputFile.delete()
     }

    stage("checkout") {
        echo fileExists('parameters.xml').toString()
    }

    stage ("parse")
    {

        def xml = readFile "${env.WORKSPACE}/parameters.xml"

        println servers(xml)
    }
}

@NonCPS
def servers(xmlfile) {
    def serv = [:]
    def config = new XmlParser().parseText(xmlfile)
    config.Config.Servers.Server.each{
    serv.add(it.@name)
    }
    return serv
}

错误输出现在是:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified field groovy.util.Node Config

3 个答案:

答案 0 :(得分:2)

以下代码

    public class VideosFragment extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.videofragment_layout , container , false);
    Bundle args = getArguments();
    TextView textView = view.findViewById(R.id.textView);
    textView.setText(args.getString("Character"));
    return view;
}
  }

打印

def xml = '''
<AS Name="123">
    <Config Name="Configuration1">
        <Servers>
            <Server Name="server1"/>
            <Server Name="server2"/>
            <Server Name="server3"/>
            <Server Name="server4"/>
         </Servers>
    </Config>
</AS>
'''

def config = new XmlParser().parseText(xml)

config.Config.Servers.Server.each{
    println it.@Name
}
jenkins管道

假设您拥有 parameters.xml

请注意,在问题中你有错误的xml:独立文档声明值必须是&#34; yes&#34;或&#34;不&#34;,不&#34;真&#34;

server1
server2
server3
server4

以下管道打印服务器名称:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<AS Name="123">
    <Config Name="Configuration1">
        <Servers>
            <Server Name="server1"/>
            <Server Name="server2"/>
            <Server Name="server3"/>
            <Server Name="server4"/>
         </Servers>
    </Config>
</AS>

答案 1 :(得分:1)

如此处评论https://issues.jenkins-ci.org/browse/JENKINS-37398所述,请尝试使用地图语法而不是属性语法。

it['Name']

而不是...

it.@Name

对我有用。

答案 2 :(得分:0)

似乎我的问题是脚本安全插件的错误。 https://issues.jenkins-ci.org/browse/JENKINS-37398