2012-12-27 17 views
5

का उपयोग कर जेनकिंस जॉब्स की एक सूची कैसे प्राप्त करें मुझे जेनकींस रीस्ट एपीआई http://jenkins-host:8080/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> 

यहाँ मैं एक सरणी नहीं दृश्य नाम में केवल नौकरी के नाम संग्रहीत करना चाहते है। पूर्व:

@list = (Test_job1, Test_job2) 
+2

दिखाने के लिए कोई कोड मिल गया? यदि नहीं, तो यह मदद कर सकता है: http://oreilly.com/catalog/perlxml/chapter/ch03.html –

+0

हालांकि यह प्रश्न पर्ल के लिए है, लेकिन क्ली के माध्यम से इसे करने का एक बहुत ही आसान तरीका है: 'curl -s http:// $ {jenkins_host}: 8080/एपीआई/जेसन | jq -r '.jobs []। नाम'' –

उत्तर

2
एक्सएमएल के साथ

:: टहनी यह होगा:

#!/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

सरल बात करने के लिए इस नियमित अभिव्यक्ति है।

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

यदि आपका एक्सएमएल का स्वरूप लगातार परिवर्तन के अधीन है, तो आप इस सरल regex मैच के बजाय एक XML पार्सर करने पर विचार करेंगे।


संपादित करें: एक स्पष्टीकरण

नियमित अभिव्यक्ति जोड़ने मान लिया गया है कि आप एक अदिश चर में XML के सभी है, 'एस' संशोधक पर्ल बताता है एक लंबी लाइन ('के रूप में पूरी स्ट्रिंग के इलाज के लिए। 'एक नई लाइन से मेल खाएगा), और' जी 'संशोधित करता है कि पहले मैच पर छोड़ने के बजाय, पर्ल को संपूर्ण स्ट्रिंग को खोजने के लिए कहें।

रेगेक्स स्वयं को सभी नाम टैग जोड़े मिलते हैं, और उनके बीच क्या रहता है कैप्चर करता है। 'संशोधित करने के लिए प्रश्न चिह्न जोड़कर'। 'पैटर्न, हम पर्ल को लालची होने के लिए कहते हैं, और इसलिए जब यह पहला समापन नाम टैग देखता है तो कैप्चरिंग बंद कर देता है। अन्यथा '। 'आखिरी नाम बंद होने तक टैग करेगा और यह वही नहीं है जो हम चाहते हैं।

हम कैप्चर भी लिख सकते थे ([^ <] +)। मुझे लगता है कि यह वरीयता का मामला है।

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;