2013-08-06 4 views
2

일부 XML을 Perl로 구문 분석하려고하지만 테스트에서 기대하는 바가 없습니다.perl XML :: 간단한 속성 blank

$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' 
     } 
    } 
}; 

OUTPUT : 여기

가 제대로 작동 최종 코드입니다.

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

답변

2

기본적으로 XML :: 간단한 선택한다면 기본적으로 다음 키를 주위 접을 : name, key, id (note 1 참조).

XML 스키마에 id 키가 포함되어 있으므로 해시가 여기에서 분리됩니다. 개체를 만들 때 KeyAttr 값을 지울 수 있습니다 (예 : $xml = XML::Simple(KeyAttr=>"");). 기본 동작을 무시합니다.

$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 옵션을 유지하면 단일 message의 형식이 동일하므로 두 경우 모두 코드 변경이 가능합니다.

+0

그들은 형식은 다음과 같이 말한다 : <메시지 ID = "MSGID"sentdate =이 donedate = "xxxxx는"상태 = "XXXXXX"gsmerror = "0"/ "xxxxx는">를 ... .. 나는 이것을 선택하기 위해 msgID를 모른다. – dannix

+1

"id"를 접는 문제를보다 잘 해결할 수 있도록 답변을 업데이트했습니다. – Ben

+0

그게 문제를 해결하는 것처럼 보이지만 하나의 메시지 만 있으면 아무런 배열도 없어 오래 작동하지 않습니다. ForceArray => 1을 추가하면 그 부분이 수정되었습니다. 그래서 얼마나 많은 레코드를 가지고 있는지를 알 수있는 방법이 필요합니다. 꺼짐을 선택하여 문서를 확인합니다. – dannix