2011-10-19 9 views
1

私はXMLとXMLファイルを解析しています:: Simpleはあなたが見ることができるようにこれはサンプルXML文書XML :: Simpleを使用して未定義の参照を処理する方法

<ip> 
    <hostname>foo</hostname> 
    <info>server</info> 
    <soluton>N/A</solution> 
    <cats> 
     <cat> 
      <title>Baz</title> 
      <flags>0</flags> 
     </cat> 
     <cat><title>FooBar</title></cat> 
    </cats> 
</ip> 
<ip> 
    <info>client</info> 
    <diagnosis>N/A</diagnosis> 
    <cats> 
     <cat><title>Foo</title></cat> 
     <cat> 
      <title>Bar</title> 
      <update>Date</update> 
     </cat> 
    </cats> 
</ip> 

でこれらのオプションに

my $xml = XML::Simple->new(ForceArray => 1, KeyAttr => 1, KeepRoot => 1); 

を使用して、いないすべてのノードは、ホスト名属性を持っています、これは私のスクリプトは、私は、ホスト名

$nb = "@{ $_->{hostname} }"; 

を取得しようとすると、いくつかのOPTIOがありますが、エラー「ARRAYのリファレンスとして未定義の値を使用することはできません」と死ぬことを引き起こしxmlの要素(十数個以上)。私はそれをどのように扱うべきですか? 割り当て前に要素の存在を確認する必要がありますか?

if (@{ $_->{hostname}) { $nb = "@{ $_->{hostname} }" } 
if (@{ $_->{solution}) { $s = "@{ $_->{solution} }" } 
if (@{ $_->{diagnosis}) {...} 

評価ブロックを使用する必要がありますか?

eval { $nb = "@{ $_->{hostname} }" }; 

たぶん

eval { 
    $nb = "@{ $_->{hostname} }"; 
    $s = "@{ $_->{solution} }"; 
    $d = "@{ $_->{diagnosis} }"; 
}; 

良い方法はありますか?

+0

も参照されます:[XMLからステップアップ:: XMLへの簡単な::のlibxml](http://www.perlmonks.org/index.pl?node_id= 490846) –

+0

あなたが提供した両方のソリューション(* if *または* eval *を使用して価値をチェックする)は、私にとっては問題ありません。 – m0skit0

答えて

0

まず、 'ForceArray'オプションを有効にする必要がありますか?おそらく、スカラー値を使用し、(可能な)配列があるかどうかチェックする方が良いでしょうか?私が使用--未定義することができることを配列への参照のための

ソリューションです:「間接参照変数または空の匿名の配列リファレンス」を意味

my $string = join '', @{ $var || [] }; 

あなたのケースでは、それは

$nb = join '', @{ $_->{hostname} || [] }; 
+0

実際のxmlが例より複雑なので、Force Arrayを有効にします。 (これは、多くの入れ子要素とリストを持つQualysスキャンレポートです)上記のソリューションより@ – Tucan

+0

@Tucanが役立ちます。 – yko