Как я могу извлечь нужные узлы из этого XML-файла, используя Perl и XPath?

После выполнения выражения XPath для извлечения всех элементов года и значений, связанных с показателями смертности, из файла XML DB, я хочу взять каждый узел из списка узлов и найти узел года, распечатать его, найти узел значения и распечатать все по отдельности. Проблема в том, что на выходе ничего не отображается.

Содержимое XML выглядит так:

<dataset type="country" name="Afghanistan" total="222">
...
        <data>
             <country id="AFG">Afghanistan</country>
             <indicator id="SP.DYN.CDRT.IN">Death rate, crude (per 1,000 people)</indicator>
             <year>2006</year>
             <value>20.3410000</value>
           </data>
           <data>
             <country id="AFG">Afghanistan</country>
             <indicator id="SP.DYN.CDRT.IN">Death rate, crude (per 1,000 people)</indicator>
             <year>2007</year>
             <value>19.9480000</value>
           </data>
           <data>
             <country id="AFG">Afghanistan</country>
             <indicator id="SP.DYN.CDRT.IN">Death rate, crude (per 1,000 people)</indicator>
             <year>2008</year>
             <value>19.5720000</value>
           </data>
           <data>
             <country id="AFG">Afghanistan</country>
             <indicator id="IC.EXP.DOCS">Documents to export (number)</indicator>
             <year>2005</year>
             <value>7.0000000</value>
           </data>
           <data>
             <country id="AFG">Afghanistan</country>
             <indicator id="IC.EXP.DOCS">Documents to export (number)</indicator>
             <year>2006</year>
             <value>12.0000000</value>
           </data>
           <data>
             <country id="AFG">Afghanistan</country>
             <indicator id="IC.EXP.DOCS">Documents to export (number)</indicator>
             <year>2007</year>
             <value>12.0000000</value>
           </data>
...
</dataset>

Код Perl выглядит так:

#Use XML Xlib parser to find elements related to death rate

my $parser = XML::LibXML->new();
my $tree = $parser->parse_file($XML_DB);
my $root = XML::LibXML::XPathContext->new($tree->documentElement());
#print $nodeSet->to_literal(); 

foreach my $node ($root->findnodes("/*/data/indicator[\@id = 'SP.DYN.CDRT.IN']/following-sibling::*")) {
    #print $node->textContent() . "\n";
    #print $node->nodeName . "\n";
    print $node->find("year") . "\n";
}
exit;

1 ответ

Решение

Выражение year в find("year") не работает так, как вы думаете, потому что ваш сложный селектор не заканчивается data узел. Используйте Xacobeo для отладки выражений XPath. Это работает:

foreach my $node ($root->findnodes(q{/*/data/indicator[@id = 'SP.DYN.CDRT.IN']/following-sibling::*})) {
    say $_->toString for $node->childNodes;
}

Выход:

2006
20.3410000
2007
19.9480000
2008
19.5720000
Другие вопросы по тегам