perl XML ::简单属性为空

时间:2013-08-06 04:17:42

标签: perl xml-parsing xml-simple

我正在尝试将一些XML解析为Perl,但测试并没有产生我期望的结果。

$buffer = qq[<DeliveryReport><message id="msgID" sentdate="xxxxx" donedate="xxxxx" status="xxxxxx" gsmerror="0" /></DeliveryReport>];

$xml = XML::Simple->new( ForceArray => 1 );

$file = $xml->XMLin($buffer) or die "Failed for $reply: $!\n";
use Data::Dumper;
print Dumper($file);

$msgid          = $file->{message}->{id};
$message_status = $file->{message}->{status};
print "OUTPUT: $msgid  $message_status";

但是输出是空白的,print Dumper看起来错误是关于id属性但是我不确定原因。

$VAR1 = {
    'message' => {
        'msgID' => {
            'status' => 'xxxxxx',
            'gsmerror' => '0',
            'sentdate' => 'xxxxx',
            'donedate' => 'xxxxx'
        }
    }
};

输出:

这是最终的代码正常工作。

use XML::Simple;
use Data::Dumper;

$xml = XML::Simple->new (KeyAttr=>'',ForceArray => 1);
$file = $xml->XMLin('

<DeliveryReport>
    <message id="msgID1" sentdate="xxxxx" donedate="xxxxx" status="xxxxxx" gsmerror="0" />
    <message id="msgID2" sentdate="yyy" donedate="yyy" status="yyy" gsmerror="0" />
</DeliveryReport>
                ') or die "Failed for $reply: $!\n";

print Dumper($file);


$numOfMsgs = @{$file->{message}};
print "<br /><br />I've received $numOfMsgs records<br />";

for($i = 0; $i < $numOfMsgs; $i++) {

     $msgid = $file->{message}->[$i]->{id};
     $message_status = $file->{message}->[$i]->{status};

     print "message id: [$msgid]<br />";
     print "status id: [$message_status]<br />";
     print "<br />";
}

1 个答案:

答案 0 :(得分:2)

默认情况下,XML :: Simple选择在默认情况下折叠以下键:namekeyid(请参阅note 1)。

您的XML架构包含id密钥,这就是散列在那里被拆分的原因。您可以在创建对象时清除KeyAttr值(例如$xml = XML::Simple( KeyAttr=>"" );)以覆盖默认行为。

您的输出包含多个message条目,如下所示:

$VAR1 = {
          'message' => [
                       {
                         'gsmerror' => '0',
                         'status' => 'xxxxxx',
                         'id' => 'msgID',
                         'donedate' => 'xxxxx',
                         'sentdate' => 'xxxxx'
                       },
                       {
                         'gsmerror' => '1',
                         'status' => 'yyyyyy',
                         'id' => 'msgID2',
                         'donedate' => 'yyyyy',
                         'sentdate' => 'yyyyy'
                       }
                     ]
        };

因此,您需要稍微调整代码,以便考虑包含一系列消息哈希的%message。如果保留message选项,则单个ForceArray的格式相同,因此您的代码更改将适用于这两种情况。