如何使用XMLAPI获取Jenkins作业列表

如何使用XMLAPI获取Jenkins作业列表,xml,perl,jenkins,Xml,Perl,Jenkins,我从Jenkins REST APIhttp://jenkins-host:8080/api/xml。现在,我正在将作业名称列表从xml中提取到perl数组或变量中。以下是XMLAPI的格式 <hudson> <job> <name>Test_Job1</name> <url>http://jenkins-host:8080/job/Test_job1/</url> <color>red</co

我从Jenkins REST API
http://jenkins-host:8080/api/xml
。现在,我正在将作业名称列表从xml中提取到perl数组或变量中。以下是XMLAPI的格式

<hudson>
<job>
  <name>Test_Job1</name>
  <url>http://jenkins-host:8080/job/Test_job1/</url>
  <color>red</color>
</job>
<job>
  <name>Test_job2</name>
  <url>http://jenkins-host:8080/job/Test_job2/</url>
  <color>red</color>
</job>
<view>
  <name>Test_View</name>
  <url>http://jenkins-host:8080/</url>
</view>
</hudson>

最简单的方法是使用正则表达式

my @matches = ( $xml =~ m(<name>(.*?)</name>)gs) ;
my@matches=($xml=~m((.*))gs);

如果XML格式受频繁更改,那么您将需要考虑XML解析器,而不是简单的正则表达式匹配。


编辑:添加解释

正则表达式假定所有XML都在一个标量变量中,'s'修饰符告诉Perl将整个字符串视为一个长行('s'将匹配一个新行),'g'修饰符告诉Perl搜索整个字符串,而不是在第一次匹配时退出

正则表达式本身只是查找所有的名称标记对,并捕获它们之间的内容。通过添加问号来修改“.”模式,我们告诉perl不要贪婪,因此当它看到第一个结束名标记时,它停止捕获。否则“.”将匹配到姓氏结束标记,这不是我们想要的


我们还可以使用XML::Twig将捕获编写为([^),它应该是:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my @jobs;
XML::Twig->new( twig_roots => { 'job/name' => sub { push @jobs, $_->text; } })
         ->parseurl( 'http://jenkins-host:8080/api/xml');

有代码要显示吗?如果没有,这可能会有所帮助:尽管这个问题是针对perl的,但通过cli实现它的一个非常简单的方法是:
curl-s http://${jenkins_host}:8080/api/json | jq-r'.jobs[].name'
#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my @jobs;
XML::Twig->new( twig_roots => { 'job/name' => sub { push @jobs, $_->text; } })
         ->parseurl( 'http://jenkins-host:8080/api/xml');
my $xml = <<XML;
<hudson>
<job>
  <name>Test_Job1</name>
  <url>http://jenkins-host:8080/job/Test_job1/</url>
  <color>red</color>
</job>
<job>
  <name>Test_job2</name>
  <url>http://jenkins-host:8080/job/Test_job2/</url>
  <color>red</color>
</job>
<view>
  <name>Test_View</name>
  <url>http://jenkins-host:8080/</url>
</view>
</hudson>
XML

my @rules = (
  'hudson' => sub { $_[1]->{name} },
  job  => sub { '@name' => $_[1]{name} },
  name => 'content',
  _default => undef,
);
my $xr = XML::Rules->new(rules => \@rules);
my $data = $xr->parse($xml);

print Dumper $data;
my @jobs;
my @rules = (
  job  => sub { push @jobs, $_[1]{name} },
  name => 'content',
  _default => undef,
);
my $xr = XML::Rules->new(rules => \@rules);
$xr->parse($xml);

print Dumper \@jobs;