【问题标题】:Parse jenkins rest API解析詹金斯休息 API
【发布时间】:2013-01-25 11:22:20
【问题描述】:

我正在使用带有树的 Jenkins xml api。这是我用于本地托管 Jenkins 服务器的 url。

http://localhost:8080/api/xml?
   tree=jobs[name,description,color,healthReport[score,description]]

上面的 url 显示我的 xml 输出为:

<hudson>
    <job>
        <description/>
        <name>build1</name>
        <color>disabled</color>
        <healthReport>
            <description>Build stability: 2 out of the last 5 builds failed.</description>
            <score>60</score>
        </healthReport>
    </job>
    <job>
        <description>test job description check.</description>
        <name>Build2</name>
        <color>blue</color>
        <healthReport>
            <description>Build stability: No recent builds failed.</description>
            <score>100</score>
        </healthReport>
    </job>
    <job>
        <description/>
        <name>Build3</name>
        <color>blue</color>
        <healthReport>
            <description>Build stability: 3 out of the last 4 builds failed.</description>
            <score>25</score>
        </healthReport>
    </job>
 </hudson>

现在我想以一种可以进一步处理标签值的方式解析 xml 输出。

例如:

foreach job
if color=blue
print jobname : color 
if score = 100
etc

如何在 perl 中做到这一点,我应该使用哪个 perl 模块?

【问题讨论】:

标签: perl xml-parsing jenkins


【解决方案1】:

开始于:

use XML::LibXML qw( );
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xml);
my $root = $doc->documentElement();
  • foreach 工作

    for my $job ($root->findnodes('job'))
    
  • 如果颜色=蓝光

    my $color = $job->findvalue('color/text()');
    
  • 打印作业名称:颜色

    my $job_name = $job->findvalue('name/text()');
    
  • 如果分数 = 100

    my $score = $job->findvalue('healthReport/score/text()');
    

【讨论】:

  • 我不确定是否需要/text()。它可能隐含地发生。
  • 您好池上,我尝试实现您在代码中提供的逻辑。好像它不起作用。我收到此错误:Can't locate object method "findvalue" via package "XML::LibXML::NodeList" at testperl.pl line 36.
  • XML::LibXML::NodeList?你做了一些与导演不同的事情。 $job 不包含作业元素节点。
  • 您好池上,代码现在正在运行。 XML::LibXML 正在从文件夹中挑选 xml 文件。我想解析 URL(带有 xml 内容)。我用谷歌搜索了它,但我没有得到任何解决方案。有没有办法用 XML::LibXML 解析 url?
  • 不,您要解析由 URL 标识的文档。您需要先获取该文档(使用 LWP 或类似的工具),然后按照我的说明进行解析。 (-&gt;parse_string($response-&gt;decoded_content( charset =&gt; 'none' )))
【解决方案2】:

这是我通过 LWP::UserAgent 获取 Web 文档后得到的结果。

XML::LibXML->load: specify location, string, or IO at 12.pl line 23

虽然我传递了一个要解析的 url 内容,但我收到了上述错误。

这是我的 Perl 代码:

#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
use XML::LibXML;
my $url = 'http://localhost:8080/api/xml?tree=jobs[name,description,color,healthReport[score,description]]';
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
my $response = $ua->get($url);

if ($response->is_success) {
        my $content = $response->decoded_content;
        #print $response->decoded_content;
        my $parser = XML::LibXML->new();
        my $xmldoc = $parser->load_xml($response->decoded_content);
        for my $job ($xmldoc->findnodes('/hudson/job')) {
                my $color = $job->findvalue('color/text()');
                print $color;
        }
}

【讨论】:

  • 1) 应该是 $parser-&gt;parse_string($xml),就像我向你展示的那样,或者 XML::LibXML-&gt;load_xml(string =&gt; $xml)。 2) 那应该是$response-&gt;decoded_content( charset =&gt; 'none' ) 以确保 LWP 不会破坏 XML。 (可以!)
【解决方案3】:

XML::Hash 是将 XML 字符串转换为 perl 哈希的另一个不错的选择。

# Conversion from a XML String to a Hash
my $xml_converter = XML::Hash->new();
my $xml_hash = $xml_converter->fromXMLStringtoHash($xml);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多