2010-05-11 3 views
0

Я хочу вытащить данные с помощью анализатора XML :: XPath из файла XML DB с сайта Worldbank. Проблема в том, что я не вижу никаких результатов в выходе. Я должен что-то пропустить в коде. В идеале я хотел бы извлечь только статистику смертности из каждой страны XML DB (год и значение). Я использую это как часть моего входа:PERL XPath Parser Help

http://data.worldbank.org/sites/default/files/countries/en/afghanistan_en.xml

use strict; 
use LWP 5.64; 
use HTML::ContentExtractor; 
use XML::XPath; 

my $agent1 = LWP::UserAgent->new; 
my $extractor = HTML::ContentExtractor->new(); 

#Retrieve main Worldbank country site 
my $mainlink = "http://data.worldbank.org/country/"; 
my $page = $agent1->get("$mainlink"); 
my $fulltext = $page->decoded_content(); 

#Match to just all available countries in Worldbank 
my $country = ""; 
my @countryList; 
if (@countryList = $fulltext =~ m/(http:\/\/data\.worldbank\.org\/country\/.*?")/gi){ 
    foreach $country(@countryList){ 
     #Remove " at the end of link 
     $country=~s/\"//gi; 
     print "\n" . $country; 

     #Retrieve each country profile's XML DB file 
     my $page = $agent1->get("$country"); 
     my $fulltext = $page->decoded_content(); 
     my $XML_DB = ""; 
     my @countryXMLDBList; 

     if (@countryXMLDBList = $fulltext =~ m/(http:\/\/data\.worldbank\.org\/sites\/default\/files\/countries\/en\/.*?\.xml)/gi){ 
      foreach $XML_DB(@countryXMLDBList){ 

       my $page = $agent1->get("$XML_DB"); 
       my $fulltext = $page->decoded_content(); 
       #print $fulltext; 
       #Use XML XPath parser to find elements related to death rate 
       my $xp = XML::XPath->new($fulltext); #my $xp = XML::XPath->new("afghanistan_en.xml"); 
       my $nodeSet = $xp->find("//*"); 
       if (!$nodeSet->isa('XML::XPath::NodeSet') || $nodeSet->size() == 0) { 
        #No match found 
        print "\nMatch not found!"; 
        exit; 
       } else { 
        foreach my $node ($nodeSet->get_nodelist){ 
         print "\n" . $node->find('country')->string_value; 
         print "\n" . $node->find('indicator')->string_value; 
         print "\n" . $node->find('year')->string_value; 
         print "\n" . $node->find('value')->string_value; 
         exit; 
        } 
       } 
      } 
      #Build line graph based on death rate statistics and output some image file format 
     } 
    } 
} 

Я также изучаю, используя выражение XPath «после-собрата», но не знает, как правильно его использовать. Например, у меня есть следующий набор данных XML, где меня интересует только вытягивание братьев и сестер непосредственно после индикатора только для данных о смертности.

<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> 

Любая помощь будет очень признательна !!!

+0

Вы должны указать свой вопрос, что это то, что вам – Zaid

+0

Извините, что ... теперь я уже немного обрисовал проблему! – user338516

+2

Возможно, вы не хотите использовать XML :: XPath - модуль старые, медленные и более активно не поддерживаемые. Я рекомендую вам перейти на XML :: LibXML. API почти идентичен, но он намного быстрее и лучше поддерживается. –

ответ

0

Я не понимаю, первую часть вопроса - это говорит о том, что:

Я не вижу каких-либо результатов в выходе. Я должен что-то пропустить в .

Однако, это не вопрос вообще. Особенно, когда нет входных данных, и нет определения «результатов».

Для второй части:

Я также изучаю, используя выражение XPath «после-собрата», но не знает, как правильно его использовать. Для примера у меня есть следующий набор из XML-данных, в которых меня интересует только , вытягивающих родных братьев непосредственно после индикатора только для данных о смертности.

Используйте следующие выражения XPath (предполагая, что data элементы являются дети верхнего элемента документа XML:.

/*/data/indicator[@id = 'SP.DYN.CDRT.IN']/following-sibling::*

+0

Спасибо! Я попробую! Кстати, я обновил первую часть моего вопроса для вас. – user338516