我正在尝试查看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"/>
有什么想法吗?
答案 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;
}
}