2015-03-02 4 views
0

Je commence à coder, en essayant de créer une base de données à partir d'un fichier XML qui est une liste d'industries, de noms de sociétés et de symboles. Je l'ai vu quelques exemples d'un code PHP qui importe les données en MySQL qui avait l'air quelque chose comme:Importer du XML dans la base de données MySQL

<?php 

$url ="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.industry%20where%20id%20in%20(select%20industry.id%20from%20yahoo.finance.sectors)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); //getting url contents 

$data = curl_exec ($ch); //execule curl request 
curl_close($ch); 

$xml = simplexml_load_string($data); 

$con=mysql_connect("localhost", "root", ""); //connect to server 
mysql_select_db("symbol_list", $con) or die(mysql_error()); //select database 

foreach ($xml -> item as $row) { 
    $industry = $row -> industry; 
    $company = $row -> name; 
    $symbol = $row -> symbol; 

// perform sql query 


$sql = "INSERT INTO 'symbols_xml' ('industry', 'company', 'symbol')" 
    . "VALUES ('$industry', '$company', '$symbol')"; 

$result = mysql_query($sql); 
if (!$result) { 
    echo 'MySQL ERROR'; 
} else { 

    echo 'SUCCESS'; 
} 


          } 

?> 

Cependant, parce que le XML est formaté comme ceci:

<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="215" yahoo:created="2015-03-02T20:58:57Z" yahoo:lang="en-US"> 
<results> 
<industry id="112" name="Agricultural Chemicals"> 
    <company name="Adarsh Plant Protect Ltd" symbol="ADARSHPL.BO"/> 
    <company name="African Potash Ltd" symbol="AFPO.L"/> 
    ...... 
</industry> 
<industry id="132" name="Aluminum"> 
    <company name="AEI Corp Ltd" symbol="A18.SI"/> 
    <company name="Alcoa Inc" symbol="AA.BA"/> 
    <company name="Alcoa Inc" symbol="AA.MX"/> 
    ...... 

Mon code PHP ci-dessus est incapable de reconnaître les valeurs ... est-il possible d'importer les attributs (nom de l'industrie, le nom de l'entreprise et symbole) pour qu'il ressemble à:

#| Industry | Company | Symbol 
    -|----------- ------------ ------- 
    1| Aluminium | Alcoa Inc. | AA.BA 

et ainsi de suite ..

J'ai récemment commencé à apprendre PHP et bases de données alors s'il vous plaît pardonnez-moi si c'est une question noobish qui a perdu votre temps. xD

Merci.

+0

beaucoup s code impleur à faire. PHP Importer le fichier XML dans la base de données - http://www.kvcodes.com/2017/04/php-import-xml-file-database/ – Kvvaradha

Répondre

2

En fait, vous n'étiez pas très loin.

Pour chercher un attribut, vous pouvez le faire de deux façons:

  1. accès comme si le nœud était un tableau $node['attributeName']
  2. Utilisez une méthode attributs nommés(), et vous pouvez aussi faire: $node->attributes()->attributeName;

Voici votre code mis à jour:

<?php 

$url ="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.industry%20where%20id%20in%20(select%20industry.id%20from%20yahoo.finance.sectors)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); //getting url contents 

$data = curl_exec ($ch); //execule curl request 
curl_close($ch); 

$xml = simplexml_load_string($data); 

$con=mysql_connect("localhost", "root", ""); //connect to server 
mysql_select_db("symbol_list", $con) or die(mysql_error()); //select database 

foreach ($xml->results->industry as $industryNode) 
{ 
    foreach ($industryNode->company as $companyNode) 
    { 
     $industry = (string) $industryNode['name']; 
     $company = (string) $companyNode['name']; 
     $symbol = (string) $companyNode['symbol']; 

     // perform sql query 
     $sql = "INSERT INTO 'symbols_xml' ('industry', 'company', 'symbol')" 
      . "VALUES ('$industry', '$company', '$symbol')"; 

     $result = mysql_query($sql); 
     if (!$result) 
     {   
      echo 'MySQL ERROR'; 
     } 
     else 
     { 
      echo 'SUCCESS'; 
     } 
    } 
} 
+0

Merci beaucoup! Ce truc "node" semble fonctionner car maintenant je reçois au moins un msg "MySQL ERROR" d'une instruction "if". Une idée qui pourrait être erronée avec mysql_query? –

+0

Faites un 'echo $ sql;' dans la 2ème boucle foreach et ajoutez 'echo die (mysql_error());' inside si l'instruction 'if (! $ Result)'. Vous pouvez également copier coller la requête qui est sortie dans votre client mysql préféré et voir l'erreur. – alfallouji

+0

Génial, merci encore. Le problème était une syntaxe incorrecte - n'aurait pas dû mettre autour des noms de colonnes dans $ sql = "INSERT INTO 'symbols_xml' (industrie, compagnie, symbole)" –