Astuces XML vers PHP

Importation XML sur MYSQL en PHP d'un contenu en Open Data

Dans cet article je vais vous expliquer les moyens que nous avons à notre disposition pour importer un fichier XML en license OpenData comprenant des informations géographiques liés à différents pays. La majorité des informations concernant les différents pays sont relatives normes ISO qu'on peut retrouver via ce lien. L'objectif est d'importer un document XML avec PHP et sa fonction SimpleXML , le fichier contient des données intéressantes tels que les langues parlées , la lecture des pays en différentes langues, la monnaie, les pays aux frontières, l'indicatif téléphonique et le country code .

Voici le lien du fichier XML sur le github de mledoze .   Premièrement nous créons une base de donnée COUNTRIES qui va stocker les différents attributs dans des colonnes. On notera que cette base de données comprendra différents caractères dans différentes langues, j'ai donc opter pour l'utilisation de l'encodage  utf8_unicode_ci, je n'ai pas pris le temps de règler le format des colonnes  autre que celui de la clé primaire .

 
CREATE DATABASE `COUNTRIES`;

CREATE TABLE `country` (
`name` TEXT NOT NULL ,
`tld` TEXT NOT NULL ,
`cca2` TEXT NOT NULL ,
`ccn3` TEXT NOT NULL ,
`cca3` VARCHAR(4) ,
`currency` TEXT NOT NULL ,
`callingCode` FLOAT NOT NULL  ,
`capital` TEXT NOT NULL ,
`altSpellings` TEXT NOT NULL ,
`relevance` TEXT NOT NULL ,
`region` TEXT NOT NULL ,
`subregion` TEXT NOT NULL ,
`nativeLanguage` TEXT NOT NULL ,
`translations` TEXT NOT NULL ,
`latlng` TEXT NOT NULL ,
`demonym` TEXT NOT NULL ,
`borders` TEXT NOT NULL ,
`area` TEXT NOT NULL ,
PRIMARY KEY ( `cca3` )
) ENGINE = MYISAM

Note : si l'envie vous prends de vouloir rajouter les dialectes et les langues mortes de chaque pays pour compléter la base de donnée , n'hésitez pas à me contacter.

Une fois les champs créés on va coder un script en PHP qui va importer le contenu du fichier XML dans la base de donnée

.  
<?php

$db_host = "localhost";
$db_username = "root";
$db_password = "password";
$db_name = "COUNTRIES";
$table_name = "country";
// Début de connection à la base de donnée
mysql_connect($db_host,$db_username,$db_password) or die ('Impossible de se connecter à la base de donn&eacute;:'.mysql_error());
mysql_select_db($db_name) or die ('Impossible d&apos;ouvrir la base de donnée , FAIL ! '.$db_name.' : '.mysql_error());
//Fin : connexion à la base et sa séléction

//On charge le fichier XML contenant les données relatives aux pays
 $countries = simplexml_load_file('countries.xml');
// Pour le deboggage on affiche les résultat en HTML et avec l'encodage utf8
header('Content-Type: text/html; charset=utf-8');
// mysql_real_escape_string sert au nettoyage des entrées et des apostrophes étant susceptibles de faire 
//jaillir des erreurs


foreach ($countries as $key => $value) {
$name = mysql_real_escape_string($value[0]["name"]);
$tld = mysql_real_escape_string($value[0]["tld"]);
$cca2 = mysql_real_escape_string($value[0]["cca2"]);
$ccn3 = mysql_real_escape_string($value[0]["ccn3"]);
$cca3 = mysql_real_escape_string($value[0]["cca3"]);
$currency = mysql_real_escape_string($value[0]["currency"]);
$callingCode = mysql_real_escape_string($value[0]["callingCode"]);
$capital = mysql_real_escape_string($value[0]["capital"]);
$altSpellings = mysql_real_escape_string($value[0]["altSpellings"]);
$relevance = mysql_real_escape_string($value[0]["relevance"]);
$region = mysql_real_escape_string($value[0]["region"]);
$subregion = mysql_real_escape_string($value[0]["subregion"]);
$nativeLanguage = mysql_real_escape_string($value[0]["nativeLanguage"]);
$translations = mysql_real_escape_string($value[0]["translations"]);
$latlng = mysql_real_escape_string($value[0]["latlng"]);
$demonym = mysql_real_escape_string($value[0]["demonym"]);
$borders = mysql_real_escape_string($value[0]["borders"]);
$area = mysql_real_escape_string($value[0]["area"]);
   $sql = "INSERT INTO country (name, tld, cca2, ccn3, cca3, currency, callingCode, capital, altSpellings, relevance, region, subregion, nativeLanguage, translations, latlng, demonym, borders, area) values ('$name', '$tld', '$cca2', '$ccn3', '$cca3', '$currency', '$callingCode', '$capital', '$altSpellings', '$relevance', '$region', '$subregion', '$nativeLanguage', '$translations', '$latlng', '$demonym', '$borders', '$area')";
    mysql_query($sql) or exit(mysql_error()); 
}
//fin du script d'importation
?>