使用XML :: Simple解析XML的Perl脚本

时间:2015-02-16 21:08:11

标签: xml perl

我正在尝试解析以下XML。问题是输出中没有任何内容:

XML文件:

<response>
  <response-name>SendUnitaryResponse</response-name>
    <params>
        <request-status>OK</request-status>
        <unitary-request-id>B4004A3E</unitary-request-id>
    </params>
</response>

脚本:

use XML::Simple;
use Data::Dumper;
my $access = XMLin('C:\Users\s.baccar\Desktop\access.log');
print $access->{response}->{response-name};

3 个答案:

答案 0 :(得分:3)

正如Sobrique指出的那样,XML :: Simple并不那么简单。在这种情况下,它会删除根元素(<response>),这就是print语句失败的原因。你可以改变你的印刷品:

print $access->{response-name};

...或告诉XML :: Simple保留根元素:

my $access = XMLin('C:/Users/s.baccar/Desktop/access.log', KeepRoot => 1);

......或者最重要的是,使用不同的模块。

答案 1 :(得分:1)

XML::Simple - 不是。它适用于简单的XML。

在它的文档中说:

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。

相反,我喜欢XML::Twig(存在其他选项):

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig; 

my $xml = q{<response>
  <response-name>SendUnitaryResponse</response-name>
    <params>
        <request-status>OK</request-status>
        <unitary-request-id>B4004A3E</unitary-request-id>
    </params>
</response>};

my $twig_parser = XML::Twig -> new -> parse ( $xml );
#in XML::Twig - root is the 'top' node, e.g. <response> in this case. 
print $twig_parser -> root -> first_child_text('response-name');

如果您给它一个文件名,这也有效:

my $twig_parser = XML::Twig -> new -> parsefile ( 'C:\Users\myuser\Documents\test.xml' );
print $twig_parser -> root -> first_child_text('response-name');

答案 2 :(得分:1)

除了其他人所说的内容外,请use strict;(和use warnings;

如果我将这些添加到您的脚本中,我会得到:

Bareword "response" not allowed while "strict subs" in use at x.pl line 8.
Bareword "name" not allowed while "strict subs" in use at x.pl line 8.

(注意第8行是print $access->{response}->{response-name};

该行有效地变为print $access->{response}->{0};

您需要使用'response-name'