5

Jenkins REST API から生の xml データを取得しましたhttp://jenkins-host:8080/api/xml。現在、この xml からジョブ名リストを perl 配列または変数に取得する作業を行っています。以下はxml APIのフォーマットです

<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>

ここでは、ビュー名ではなく、ジョブ名のみを配列に格納したいと考えています。元:

@list = (Test_job1, Test_job2)
4

3 に答える 3

2

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');
于 2012-12-27T20:10:59.617 に答える
2
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;
于 2012-12-27T20:39:08.400 に答える
1

最も簡単なのは、この正規表現です。

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

XML の形式が頻繁に変更される可能性がある場合は、この単純な正規表現の一致ではなく、XML パーサーを検討する必要があります。


編集:説明を追加する

正規表現は、すべての XML が 1 つのスカラー変数に含まれていることを前提としています。's' 修飾子は、Perl に文字列全体を 1 つの長い行として扱うように指示します ('.' は改行に一致します)。最初の一致で終了するのではなく、文字列全体を検索します。

正規表現自体は、単にすべての名前タグのペアを見つけて、それらの間にあるものをキャプチャします。疑問符を追加して ' を変更します。' パターンでは、perl に貪欲でないように指示するため、最初の終了名タグを検出するとキャプチャを停止します。それ以外は '。' は最後の名前の終了タグまで一致し、それは私たちが望んでいるものではありません。

キャプチャを ([^<]+) と書くこともできます。それは好みの問題だと思います。

于 2012-12-27T18:11:30.573 に答える