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


How to convert xml response using curl into array then store in database using php

我正在服务器上调用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);

您可以这样做。遍历所有数组以获取wirelineServices的所有值。这将导致多达2条记录。在字符串中插入所有值,然后将字符串放入数组中。

为我们的数据库进行查询。我听说每个值都有一列。并用我们的字符串插入数组,以将所有记录都放入数据库。

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

<?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);
}
?>