【问题标题】:perl XML::Simple attributes blankperl XML::简单属性空白
【发布时间】:2013-08-06 23:03:05
【问题描述】:

我正在尝试将一些 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 />";
}

【问题讨论】:

    标签: perl xml-parsing xml-simple


    【解决方案1】:

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

    您的 XML 架构包含 id 键,这就是散列在此处拆分的原因。您可以在创建对象(例如 $xml = XML::Simple( KeyAttr=&gt;"" );)时清除 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。如果您保留ForceArray 选项,则单个message 的格式将相同,因此您的代码更改将适用于两种情况。

    【讨论】:

    • 他们说格式如下: .. ... 我不知道选择它们的 msgID。
    • 我更新了答案以更好地解决折叠问题id
    • 这似乎可以解决问题,但如果只有一条消息,它就不再有效,因为没有数组。添加 ForceArray => 1 back 解决了这个问题。所以我只需要一种方法来知道我有多少记录,然后我可以循环它们。关闭以检查文档。
    • 您可以通过在标量上下文中评估数组引用来找到数组大小,例如my $size = @{$file-&gt;{message}};
    • 谢谢 Ben,这是在我发布之后发生的。我会用这些变化更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2010-09-20
    相关资源
    最近更新 更多