2010-05-19 4 views
0

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

Содержание 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; 

ответ

2

Выражение 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 
+0

Спасибо за вашу большую помощь! – user338516

+0

daxim, у вас есть образец кода, который использует Xacobeo? – user338516

+1

WTF, Xacobeo - графическое приложение - просто установите и запустите его. Кроме того, вы должны отвечать __accept answer__, см. Http://stackoverflow.com/faq#When%20you%20have%20decided%20which%20answer%20is%20the%20most%20helpful%20to%20you – daxim

Смежные вопросы