2010-05-11 3 views
0

Je souhaite extraire des données à l'aide d'un analyseur XML :: XPath à partir d'un fichier XML DB du site Worldbank. Le problème est que je ne vois aucun résultat dans la sortie. Je dois manquer quelque chose dans le code. Idéalement, je voudrais extraire seulement les statistiques de taux de mortalité de la DB XML de chaque pays (année et valeur). J'utilise cela comme une partie de mon entrée: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 
     } 
    } 
} 

Je suis également en utilisant l'expression XPath « following-sibling », mais ne savez pas comment l'utiliser correctement. Par exemple, j'ai l'ensemble de données XML suivant où je suis seulement intéressé à tirer des frères et soeurs directement après l'indicateur pour les données de taux de mortalité juste.

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

Toute aide serait grandement appréciée !!!

+0

Vous devez préciser votre question Qu'est-ce que vous Désolé, veuillez éditer votre question pour l'inclure – Zaid

+0

Désolé pour ça ... maintenant, je vous ai décrit un peu plus le problème! – user338516

+2

Vous ne voulez probablement pas utiliser XML :: XPath - le module est vieux, lent et n'est plus maintenu activement Je vous recommande passer à XML :: LibXML. L'API est presque identique mais c'est beaucoup plus rapide et mieux supporté. –

Répondre

0

Je ne comprends pas la première partie de la question - il est dit que:

Je ne vois aucun résultat dans la sortie . Je dois manquer quelque chose dans le code.

Cependant, ce n'est pas une question du tout. Surtout, quand il n'y a pas de données d'entrée fournies, et aucune définition de "résultats".

Pour la deuxième partie:

Je suis également à la recherche en utilisant l'expression XPath "following-sibling", mais ne sais pas comment l'utiliser correctement. Pour par exemple, j'ai l'ensemble suivant de données XML où je suis seulement intéressé par tirant frères et sœurs directement après l'indicateur pour les données de taux de mortalité juste.

Utilisez les expressions XPath suivantes (en supposant que les data éléments sont des enfants de l'élément supérieur du document XML.

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

+0

Merci! Je vais essayer ça! Au fait, j'ai mis à jour la première partie de ma question pour vous. – user338516