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 に答える