在Perl中提取数据之前测试XML标记的参数

时间:2014-05-24 07:49:05

标签: xml perl parsing

我正在尝试查看XML中的标记。我的脚本运行到dbReferences(有几个用于输入),但我只想采用' id'如果'键入' =" EC"。

我正在考虑做一些if语句,它会查看' type'在获取id之前的dbReference:

foreach $entry (@{$data->{entry}}) {         
        foreach $ref (@{$entry->{dbReference}}) {
            if($ref type ="EC"){
                #then print the id
            }
        }
 }

编辑: 条目XML的格式如下,需要检查连续的大量dbReferences:

<dbReference type="NCBI Taxonomy" id="9606"/>
<dbReference type="PubMed" id="8274401"/>
<dbReference type="EC" id="1.1.5.54"/>

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你可以使用XPath。对于id属性等于dbReference的所有type元素(在任何嵌套级别中),此表达式返回EC

//dbReference[@type="EC"]/@id

代码段:

use XML::LibXML;

my $dom = XML::LibXML->new->parse_file('file.xml');
my $node = $dom->findnodes('//dbReference[@type="EC"]/@id');
print 'Result: '.$node;

您可以使用额外限制调整表达式(例如:节点的绝对路径,或其他属性,节点位置等),以防这不会返回唯一值。

答案 1 :(得分:0)

我猜您的输入类似于

<xml>
<dbReference type="NCBI Taxonomy" id="9606"/>
<dbReference type="PubMed" id="8274401"/>
<dbReference type="EC" id="1.1.5.54"/>
<dbReference type="NCBI Taxonomy" id="9606"/>
<dbReference type="PubMed" id="8274401"/>
<dbReference type="EC" id="1.1.5.54"/>

所以试试:

my $ref = XMLin($String);


                #warn Dumper($ref);
       foreach $ref1 (keys %{$ref->{dbReference}}) {
            if($ref->{dbReference}->{$ref1}->{type} eq "EC"){
                #then print the id
                $ref1;
            }
        }