使用Perl&amp ;;解析XML XML :: Twig - 提取更多嵌套子项

时间:2011-09-15 14:03:58

标签: xml perl xml-twig

目前正试图找出如何最好地处理以下示例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-&gt; first_child('DIRECTOR_LIST') - &gt; children_text('DIRECTOR');

然而,我的问题是,有时候,这些孩子不存在(例如根本没有发送C部分数据),这使我无法忍受悲伤,因为以下内容不起作用:

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

我对如何实现我的目标感到非常难过,并且非常感谢任何建议,欢迎简单的答案;-)

1 个答案:

答案 0 :(得分:4)

如果其中一个方法找不到孩子,那么它将返回undef,当然你不能调用方法。

所以你有两个选择:

您可以测试链式表达式的每一步:

@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');

第二种选择可能更容易阅读和维护。