2015-03-02 95 views
0

我是新来编码,试图从一个XML文件,这是一个行业,公司名称和符号列表创建数据库。我看到的是,这些数据导入到MySQL中的PHP代码看上去像一个例子:将XML导入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'; 
} 


          } 

?> 

然而,由于XML的格式如下:上述

<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"/> 
    ...... 

我的PHP代码是无法识别的值... 有没有办法导入的属性(行业名称,公司名称和符号),使得它看起来像:

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

等等。

我刚刚开始学习PHP和数据库,所以请原谅我,如果这是一个浪费你时间的高频问题。 xD

谢谢。

+0

很多小号执行代码。 PHP将XML文件导入数据库 - http://www.kvcodes.com/2017/04/php-import-xml-file-database/ – Kvvaradha 2017-04-05 02:45:48

回答

2

你其实并不是很远。

为了获取一个属性,你可以做到这一点有两种方式:

  1. 访问它,就好像节点是一个数组$node['attributeName']
  2. 使用指定的属性()的方法,你也可以这样做:$node->attributes()->attributeName;

这里是你的代码更新:

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

非常感谢!这个“节点”的东西似乎工作,因为现在我至少从“if”语句获得“MySQL错误”味精。任何想法可能是错误的mysql_query? – 2015-03-02 23:07:22

+0

在第二个foreach循环中执行'echo $ sql;'并在if(!$ result)语句中添加'echo die(mysql_error());'内部。您也可以复制粘贴输出到您最喜爱的mysql客户端的查询并查看错误。 – alfallouji 2015-03-02 23:12:18

+0

太棒了,再次感谢。这个问题是错误的语法 - 不应该在$ sql =“INSERT INTO'symbols_xml'(行业,公司,符号)中放置'列名'” – 2015-03-03 00:08:41