2011-02-05 11 views
1

私は、私が作成した単純なXMLファイルを解析しようとしています...それは次のようになります。Perlの単純なXML質問

<project name="AU" date="2/2/2011" location="proj1"> 
    <GenomeList name="Processed"> 
    <genome name="AU4" /> 
    </GenomeList> 
    <GenomeList name="Unprocessed"> 
     <genome name="AU1" /> 
     <genome name="AU2" /> 
     <genome name="AU3" /> 
    </GenomeList> 
</project> 

私が午前問題は、ゲノムリストの解析である:それはと思われますリスト中の一つだけの要素があるときには、ここに見られるように、別の方法でエントリを追加します。

'Unprocessed' => { 
        'genome' => { 
           'AU2' => {}, 
           'AU3' => {}, 
           'AU1' => {} 
           } 
       }, 
'Processed' => { 
       'genome' => { 
          'name' => 'AU4' 
          } 
       } 

は、私はそれが一貫性のある方法で解析するのに得ることができる方法はありますか?

私はvalueAttrを使用してみましたが、それは

おかげ

+1

これを編集してくれてありがとうございました。私はそれに問題がありました – avs3323

+0

コードの関連する部分を見ることなく動作しない理由を伝えにくいです。 –

答えて

5

これはので、私は、これはあなたが使用しているものである推測しているXML::Simpleを使用して、かなり一般的な問題であるが作業しているようだdidntの。 ForceArrayはおそらくあなたが望むことをするでしょう。以下の例と出力を参照してください。 3番目のprintステートメントは、必要な処理を行う必要があります。 XML :: Simpleは、あなたの使い方が簡単で予測可能な入出力の範囲を超えて拡大されれば、決して単純ではないことに注意してください。あなたがそれを使いたいのであれば、 "Simple"という言葉でその文書を読むのをやめてください。

XML::LibXMLまたはおそらくXML::Twigも学ぶ価値があります。

use warnings; 
use strict; 
use XML::Simple; 
use Data::Dumper; 
$Data::Dumper::Terse = 1; 
$Data::Dumper::Indent = 1; 

my $multi = <<""; 
<project name="AU" date="2/2/2011" location="proj1"> 
    <GenomeList name="Processed"> 
    <genome name="AU4" /> 
    </GenomeList> 
    <GenomeList name="Unprocessed"> 
     <genome name="AU1" /> 
     <genome name="AU2" /> 
     <genome name="AU3" /> 
    </GenomeList> 
</project> 

my $single = <<""; 
<project name="AU" date="2/2/2011" location="proj1"> 
    <GenomeList name="Processed"> 
    <genome name="AU4" /> 
    </GenomeList> 
    <GenomeList name="Unprocessed"> 
     <genome name="AU1" /> 
    </GenomeList> 
</project> 

print Dumper(XMLin($multi)); 
print Dumper(XMLin($single)); 
print Dumper(XMLin($single, ForceArray => 1));