2012-12-27 28 views
5

Tôi nhận dữ liệu xml thô từ API REST Jenkins http://jenkins-host:8080/api/xml. Bây giờ tôi đang làm việc trên nhận được danh sách tên công việc ra khỏi xml này thành một mảng hoặc biến perl. sau đây là định dạng của xml APICách lấy danh sách Công việc Jenkins bằng cách sử dụng 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> 

Ở đây tôi muốn lưu trữ Chỉ tên công việc vào một mảng chứ không phải tên chế độ xem. Ví dụ:

@list = (Test_job1, Test_job2) 
+2

Got bất kỳ mã để hiển thị? Nếu không, điều này có thể giúp: http://oreilly.com/catalog/perlxml/chapter/ch03.html –

+0

Mặc dù câu hỏi này là dành cho perl, một cách rất đơn giản để làm điều đó thông qua cli là: 'curl -s http:// $ {jenkins_host}: 8080/api/json | jq -r '.jobs []. name'' –

Trả lời

2

Với XML :: cành lá nó sẽ là:

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

Điều đơn giản nhất là biểu thức chính quy này.

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

Nếu định dạng XML của bạn có thể thay đổi thường xuyên, bạn sẽ muốn xem xét trình phân tích cú pháp XML thay vì kết hợp regex đơn giản này.


Edit: thêm một lời giải thích

Các biểu hiện thường xuyên giả định rằng bạn có tất cả các XML trong một biến vô hướng, sửa đổi các 's' cho Perl để điều trị toàn bộ chuỗi như một dòng dài ('. 'sẽ khớp với một dòng mới) và' g 'sửa đổi yêu cầu Perl tìm kiếm toàn bộ chuỗi, thay vì thoát khỏi kết quả đầu tiên.

Bản thân regex chỉ tìm thấy tất cả các cặp thẻ tên và ghi lại những gì sống giữa chúng. bằng cách thêm dấu chấm hỏi để sửa đổi '. 'mẫu, chúng tôi nói perl là không tham lam, và do đó, nó dừng chụp khi nó thấy thẻ đóng tên đầu tiên. nếu không thì '. 'sẽ khớp cho đến khi thẻ đóng tên cuối cùng và đó không phải là những gì chúng tôi muốn.

Chúng tôi cũng có thể đã viết bản chụp dưới dạng ([^ <] +). Tôi cho rằng đó là vấn đề ưu tiên.

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; 

Hoặc:

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; 
Các vấn đề liên quan