2

我正在尝试将一些 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 Dumperid 属性看起来是错误的,但我不知道为什么。

$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 />";
}
4

1 回答 1

2

默认情况下,XML::Simple 默认选择折叠以下键:name, key, id(见注 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,因此您的代码更改将适用于这两种情况。

于 2013-08-06T06:12:11.110 回答