【问题标题】:get xml attribute value using perl使用perl获取xml属性值
【发布时间】:2013-09-25 06:04:01
【问题描述】:

我是 Perl 脚本的新手。我需要帮助来获取总警报的 XML 属性值(在本例中为 11)。

<?xml version="1.0" encoding="utf-8"?>
<alarm-response-list xmlns="url.com" throttle="11" total-alarms="11">
  <alarm-responses>
    <alarm id="51ebf6fc-0571-1001-0162-008014000af00" />
    <alarm id="51ec0320-07af-1001-0162-008010400af00" />
    <alarm id="51ebf6f4-0564-1001-0162-008014000af00" />
    <alarm id="51ec1512-0bb2-1001-0162-008010400af00" />
    <alarm id="51ec157d-0bed-1001-0162-008010040af00" />
    <alarm id="51ebae1b-fa31-1000-0162-008010004af00" />
    <alarm id="51ec06d4-08bf-1001-0162-00801000a4f00" />
    <alarm id="51e8303f-740a-1000-0162-008014000af00" />
    <alarm id="51ebeabc-0352-1001-0162-008010400af00" />
    <alarm id="51ebf74d-0593-1001-0162-008010040af00" />
    <alarm id="51ebf78d-05b3-1001-0162-008010004af00" />
  </alarm-responses>
</alarm-response-list>

不成功,我尝试使用以下 Perl 代码:

my $parser4 = XML::LibXML->new();
my $doc4 = $parser4->parse_file($current_working_dir.'\POSTres.xml');
my $xc = XML::LibXML::XPathContext->new( $doc4->documentElement()  );
my $nod = $xc->findnodes('//alarm-response-list');
print "A: ".$nod->getAttributes("total-alarms")."\n";

有什么想法吗?

【问题讨论】:

    标签: xml regex perl


    【解决方案1】:

    这里有一个使用XML::Twig模块的方法:

    #!/usr/bin/env perl
    
    use warnings;
    use strict;
    use XML::Twig;
    
    my $twig = XML::Twig->new(
        twig_roots => {
            '/alarm-response-list' => sub { printf qq|%s\n|, $_->att('total-alarms') },
        },  
    )->parsefile(shift);
    

    像这样运行它:

    perl script.pl xmlfile
    

    产生:

    11
    

    【讨论】:

    • 如何将值保存在匿名子例程之外的变量中?而不是仅仅在屏幕上打印出来。
    • 在解析之前声明一个变量并在处理程序中分配给它。闭包的魔力会让它发挥作用。
    【解决方案2】:

    您的 XPath 表达式不匹配,因为您在 XML 文档中指定了命名空间:

    <alarm-response-list xmlns="url.com" ...
    

    如果我们在 XPath 上下文中注册该命名空间,那么我们可以使用 XPath 提取数据:

    1. 注册命名空间。例如

      $xc->registerNs('a' => "url.com");
      
    2. 在 XPath 中使用该命名空间,例如

      my ($alarms) = $xc->findvalue('//a:alarm-response-list/@total-alarms');
      

    这会像预期的那样提取属性的值。

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2012-02-15
      相关资源
      最近更新 更多