2012-12-27 14 views
5

Ho ricevuto i dati xml grezzi dall'API REST Jenkins http://jenkins-host:8080/api/xml. Ora sto lavorando per ottenere l'elenco dei nomi di lavoro da questo xml in un array o variabile perl. Di seguito è riportato il formato XML APICome ottenere un elenco di lavori Jenkins utilizzando l'API 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> 

qui voglio conservare solo i nomi di posti di lavoro in un array non il nome della vista. Es:

@list = (Test_job1, Test_job2) 
+2

Got alcun codice per mostrare? In caso contrario, questo potrebbe aiutare: http://oreilly.com/catalog/perlxml/chapter/ch03.html –

+0

Anche se questa domanda è per perl, un modo molto semplice per farlo via cli è: 'curl -s http:// $ {jenkins_host}: 8080/api/json | jq -r '.jobs []. name'' –

risposta

2

Con XML :: Twig sarebbe:

#!/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'); 
1

La cosa più semplice da fare è questa espressione regolare.

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

Se il formato del XML è soggetto a frequenti cambiamenti, quindi ti consigliamo di prendere in considerazione un parser XML al posto di questo semplice partita regex.


Edit: l'aggiunta di una spiegazione

L'espressione regolare presuppone che tutti i XML in una variabile scalare, il modificatore 's' dice a Perl per trattare l'intera stringa come una lunga linea ('. 'corrisponderà a una nuova riga', e la 'g' modifica dice a Perl di cercare l'intera stringa, piuttosto che chiudere la prima partita.

La regex trova semplicemente tutte le coppie di tag di nome e cattura ciò che vive tra di loro. aggiungendo il punto interrogativo per modificare il '. 'pattern, diciamo che perl non è goloso, e quindi smette di catturare quando vede il primo tag name di chiusura. altrimenti '. 'corrisponde al tag di chiusura del cognome e non è quello che vogliamo.

Potremmo anche aver scritto la cattura come ([^ <] +). Suppongo che sia una questione di preferenza.

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; 

Oppure:

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; 
Problemi correlati