3

現在、次のサンプルXMLデータを処理するための最良の方法を見つけようとしています。

<FOO>
    <A>1</A>
    <B>Some Stuff</B>
    <C>
      <C1>
        <C2A><![CDATA[xxx]]></C2A>
        <C2B><![CDATA[yyy]]></C2B>
      </C1>
    </C>
</FOO>

私は現在XML::Twigを使用して他のすべてを操作していますが、このモジュールを引き続き使用して、次の目標を達成したいと思います。

C2AとC2Bからデータを抽出し、それらを変数に割り当てます。C2AとC2Bには複数のエントリが存在する可能性があることに注意してください。たとえば、@arrayに連結する必要があります。ただし、私の問題はツリーを下方向にナビゲートすることです。たとえば、私が見つけた別の例に従っている場合、このデータにはこれで十分です。

<MOVIE_LIST>
    <MOVIE>
        <NAME>Name of the Movie</NAME>
            <MOVIE_ID>28372382</MOVIE_ID>
        <DESCRIPTIONS>
             <LONG_DESCRIPTION>This is a long description</LONG_DESCRIPTION>
             <SHORT_DESCRIPTION>short description</SHORT_DESCRIPTION>
        </DESCRIPTIONS>
        <DIRECTOR_LIST>
            <DIRECTOR>director 1</DIRECTOR>
            <DIRECTOR>director 2</DIRECTOR>
        </DIRECTOR_LIST>
    </MOVIE>
    <MOVIE>
      ...
     </MOVIE>
</MOVIE_LIST>

解決策は次のとおりです。@directors= $ elt-> first_child('DIRECTOR_LIST')-> children_text('DIRECTOR');

しかし、私の問題は、これらの子供が存在しない場合があることです(たとえば、帝王切開のデータがまったく送信されない場合)。これは、次のようなことが機能しないため、私に悲しみの終わりを与えません。

@C = $elt->first_child('C')->first_child('C1')->children_text('C2');

私は自分の目標を達成する方法にかなり困惑しています。アドバイスをいただければ幸いです。簡単な回答を歓迎します;-)

4

1 に答える 1

4

メソッドの1つが子を見つけられない場合、それはundefを返します。もちろん、その上でメソッドを呼び出すことはできません。

したがって、2つのオプションが残されています。

連鎖式の各ステップをテストすることができます。

@C =    $elt->first_child('C') 
     && $elt->first_child('C')->first_child('C1')
     && $elt->first_child('C')->first_child('C1')->children_text('C2')
     || ()
    ;

またはXPathを使用します。

@C= map { $_->text } $elt->findnodes( './C/C1/C2');

2番目のオプションは、おそらく読みやすく、保守しやすいでしょう。

于 2011-09-15T14:33:32.917 に答える