我正在尝试将一些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 />";
}
答案 0 :(得分:2)
默认情况下,XML :: Simple选择在默认情况下折叠以下键:name
,key
,id
(请参阅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
的格式相同,因此您的代码更改将适用于这两种情况。