2011-09-15 45 views
3

目前試圖找出如何最好地處理下面的示例XML數據:解析XML使用Perl和XML ::嫩枝 - 進一步提取嵌套子

<FOO> 
    <A>1</A> 
    <B>Some Stuff</B> 
    <C> 
     <C1> 
     <C2A><![CDATA[xxx]]></C2A> 
     <C2B><![CDATA[yyy]]></C2B> 
     </C1> 
    </C> 
</FOO> 
我目前使用XML ::嫩枝操作

我想繼續使用這個模塊來實現我的目標,它們是:

從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( '導演');

但是,我的問題是,有時候,這些孩子不存在(例如根本沒有發送C部分數據),這給了我無盡的悲痛,因爲像下面的東西不會工作:

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

我越來越而難倒如何實現自己的目標,而且會感激感激任何建議,簡單的答案,歡迎;-)

回答

4

如果其中一種方法沒有找到一個孩子,那麼它會返回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'); 

第二個選項是可能更易於閱讀和維護。

+0

首先感謝回覆,其次感謝XML :: Twig!兩者都非常感謝:-) – simon

+0

沒問題。我希望能簡單地祝福'undef'順便說一句,它有時會簡化代碼。 – mirod