如何使用curl将xml响应转换为数组,然后使用php存储在数据库中

时间:2015-07-02 05:50:57

标签: php curl

我在服务器上调用PHP cURL方法,响应是XML类型。 cURL在标量类型变量中保存输出(在删除标记之后)。有没有办法将它存储在数据库中以便于解析?

<Response status="OK" responseTime="10">
<Results>
<wirelineServices>
<blockFIPS>360775908001027</blockFIPS>
<frn>0007556251</frn>
<providerName>Time Warner Cable LLC</providerName>
<doingBusinessAs>Time Warner Cable</doingBusinessAs>
<holdingCompanyNumber>131352</holdingCompanyNumber>
<holdingCompanyName>Time Warner Cable Inc.</holdingCompanyName>
<providerURL>www.timewarnercable.com</providerURL>
<technologies>
<technologyCode>40</technologyCode>
<typicalDownloadSpeed>0</typicalDownloadSpeed>
<typicalUploadSpeed>0</typicalUploadSpeed>
<maximumAdvertisedDownloadSpeed>9</maximumAdvertisedDownloadSpeed>
<maximumAdvertisedUploadSpeed>5</maximumAdvertisedUploadSpeed>
<overallQuality>1</overallQuality>
<speedQuality>1.00</speedQuality>
<technologyQuality>3.00</technologyQuality>
<providerQuality>3.00</providerQuality>
<downloadQuality>1.00</downloadQuality>
<uploadQuality>1.00</uploadQuality>
<maximumProviderScore>3.00</maximumProviderScore>
<maximumTechnologyScore>3.00</maximumTechnologyScore>
<maximumSpeedScore>2.00</maximumSpeedScore>
<maximumDownloadScore>2.00</maximumDownloadScore>
<maximumUploadScore>2.00</maximumUploadScore>
</technologies>
</wirelineServices>
<wirelineServices>
<blockFIPS>360775908001027</blockFIPS>
<frn>0003469442</frn>
<providerName>Verizon New York Inc.</providerName>
<doingBusinessAs>Verizon New York</doingBusinessAs>
<holdingCompanyNumber>131425</holdingCompanyNumber>
<holdingCompanyName>Verizon Communications Inc.</holdingCompanyName>
<providerURL>www.connecttoverizon.com</providerURL>
<technologies>
<technologyCode>10</technologyCode>
<typicalDownloadSpeed>0</typicalDownloadSpeed>
<typicalUploadSpeed>0</typicalUploadSpeed>
<maximumAdvertisedDownloadSpeed>5</maximumAdvertisedDownloadSpeed>
<maximumAdvertisedUploadSpeed>3</maximumAdvertisedUploadSpeed>
<overallQuality>1</overallQuality>
<speedQuality>1.00</speedQuality>
<technologyQuality>2.00</technologyQuality>
<providerQuality>2.00</providerQuality>
<downloadQuality>0.00</downloadQuality>
<uploadQuality>1.00</uploadQuality>
<maximumProviderScore>3.00</maximumProviderScore>
<maximumTechnologyScore>2.00</maximumTechnologyScore>
<maximumSpeedScore>2.00</maximumSpeedScore>
<maximumDownloadScore>2.00</maximumDownloadScore>
<maximumUploadScore>2.00</maximumUploadScore>
</technologies>
</wirelineServices>
<broadbandSource>
<stateFips>36</stateFips>
<organization>The New York State Office of Cyber Security</organization>
<organizationURL>http://www.cscic.state.ny.us/broadband/</organizationURL>
</broadbandSource>
</Results>
</Response>

我的答案。

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $request_url);
curl_setopt($curl, CURLOPT_TIMEOUT, 130);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($curl);
            curl_close($curl); 


$xml = simplexml_load_string($response);
$json = json_encode($xml);
$arr = json_decode($json,true);

1 个答案:

答案 0 :(得分:0)

你可以这样做。遍历所有数组以获取有线服务的所有值。这将导致2条记录。将所有值插入字符串并将字符串放入数组中。

查询我们的数据库。我告诉你,每个值都有一个列。并使用我们的字符串将数组内置到我们的db中。

当然,您需要更改表名,并且必须使用连接数据。

<?php
$xmlstr = '<Response status="OK" responseTime="10">
<Results>
<wirelineServices>
<blockFIPS>360775908001027</blockFIPS>
<frn>0007556251</frn>
<providerName>Time Warner Cable LLC</providerName>
<doingBusinessAs>Time Warner Cable</doingBusinessAs>
<holdingCompanyNumber>131352</holdingCompanyNumber>
<holdingCompanyName>Time Warner Cable Inc.</holdingCompanyName>
<providerURL>www.timewarnercable.com</providerURL>
<technologies>
<technologyCode>40</technologyCode>
<typicalDownloadSpeed>0</typicalDownloadSpeed>
<typicalUploadSpeed>0</typicalUploadSpeed>
<maximumAdvertisedDownloadSpeed>9</maximumAdvertisedDownloadSpeed>
<maximumAdvertisedUploadSpeed>5</maximumAdvertisedUploadSpeed>
<overallQuality>1</overallQuality>
<speedQuality>1.00</speedQuality>
<technologyQuality>3.00</technologyQuality>
<providerQuality>3.00</providerQuality>
<downloadQuality>1.00</downloadQuality>
<uploadQuality>1.00</uploadQuality>
<maximumProviderScore>3.00</maximumProviderScore>
<maximumTechnologyScore>3.00</maximumTechnologyScore>
<maximumSpeedScore>2.00</maximumSpeedScore>
<maximumDownloadScore>2.00</maximumDownloadScore>
<maximumUploadScore>2.00</maximumUploadScore>
</technologies>
</wirelineServices>
<wirelineServices>
<blockFIPS>360775908001027</blockFIPS>
<frn>0003469442</frn>
<providerName>Verizon New York Inc.</providerName>
<doingBusinessAs>Verizon New York</doingBusinessAs>
<holdingCompanyNumber>131425</holdingCompanyNumber>
<holdingCompanyName>Verizon Communications Inc.</holdingCompanyName>
<providerURL>www.connecttoverizon.com</providerURL>
<technologies>
<technologyCode>10</technologyCode>
<typicalDownloadSpeed>0</typicalDownloadSpeed>
<typicalUploadSpeed>0</typicalUploadSpeed>
<maximumAdvertisedDownloadSpeed>5</maximumAdvertisedDownloadSpeed>
<maximumAdvertisedUploadSpeed>3</maximumAdvertisedUploadSpeed>
<overallQuality>1</overallQuality>
<speedQuality>1.00</speedQuality>
<technologyQuality>2.00</technologyQuality>
<providerQuality>2.00</providerQuality>
<downloadQuality>0.00</downloadQuality>
<uploadQuality>1.00</uploadQuality>
<maximumProviderScore>3.00</maximumProviderScore>
<maximumTechnologyScore>2.00</maximumTechnologyScore>
<maximumSpeedScore>2.00</maximumSpeedScore>
<maximumDownloadScore>2.00</maximumDownloadScore>
<maximumUploadScore>2.00</maximumUploadScore>
</technologies>
</wirelineServices>
<broadbandSource>
<stateFips>36</stateFips>
<organization>The New York State Office of Cyber Security</organization>
<organizationURL>http://www.cscic.state.ny.us/broadband/</organizationURL>
</broadbandSource>
</Results>
</Response>';




$xml = simplexml_load_string($xmlstr);
$json = json_encode($xml);
$arrays = json_decode($json,true);


//this is what your array looks like
echo "<pre>";
print_r($arrays);


$counter = 0;

// get all values inside wirelineServices
foreach($arrays['Results']['wirelineServices'] AS $nbr => $arr){

      //start of the input string
      $insert[$counter] = "(";

      //iterate through $arr
      foreach($arr AS $key => $value){

            //if value is array iterate through $value
            if(is_array($value)){
                  foreach($value AS $key2 => $value2){
                        $insert[$counter] .= "'" . $value2 . "', ";
                  } 
            } else {                  
                  $insert[$counter] .= "'" . $value . "', ";            
            }
      }

      //remove last ', ' from string.
      $insert[$counter] = substr($insert[$counter], 0, -2) . ")";

      //start new string
      $counter++;

$sql = "INSERT INTO `table` (`blockFIPS`, `frn`,`providerName`,`doingBusinessAs`,`holdingCompanyNumber`,`holdingCompanyName`,`providerURL`,`technologyCode`,`typicalDownloadSpeed`,`typicalUploadSpeed`,`maximumAdvertisedDownloadSpeed`,
      `maximumAdvertisedUploadSpeed`,`overallQuality`,`speedQuality`,`technologyQuality`,`providerQuality`,`downloadQuality`,`uploadQuality`,`maximumProviderScore`,`maximumTechnologyScore`,`maximumSpeedScore`,`maximumDownloadScore`,
      `maximumUploadScore`) VALUES " . implode(",",$insert); . "";

if (mysqli_query($connect, $sql)) {
      echo 'Records created successfull';
} else {
      echo $sql . '"<br>"' . mysqli_error($connect);
}

?>