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 !!!
Vous devez préciser votre question Qu'est-ce que vous Désolé, veuillez éditer votre question pour l'inclure – Zaid
Désolé pour ça ... maintenant, je vous ai décrit un peu plus le problème! – user338516
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é. –