2014-02-12 3 views
0

올바른 방법을 사용하고 있는지 확실하지 않지만 배열에서 데이터의 개별 요소를 반향시키고 싶습니다. 그러나 성공하지 못하고 주변을 잡을 필요가 있습니다. XML 파일의 평균 연료 소비량에 대한 10 가지 변수 여기 : https://www.fueleconomy.gov/ws/rest/ympg/shared/vehicles?make=honda&model=civic연관 배열에 XML을 연결하고 특정 값을 에코 아웃

youMpgVehicle 등의 하위 항목 인 make, model, year avgMpg 만 필요하므로 같은 테이블 내에서 그들을 에코 할 수 있습니다. PHP 내의 SQL 데이터.

function download_page($path){ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$path); 
curl_setopt($ch, CURLOPT_FAILONERROR,1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 15); 
//curl_setopt($ch, CURLOPT_SSLVERSION,3); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

$retValue = curl_exec($ch);   
curl_close($ch); 
return $retValue; 
} 

$sXML = download_page('https://www.fueleconomy.gov/ws/rest/ympg/shared/vehicles?make=honda&model=civic'); 
$oXML = new SimpleXMLElement($sXML); 

$dom = new DomDocument(); 
$dom->loadXml($sXML); 
$dataElements = $dom->getElementsByTagName('vehicle'); 
$array = array(); 
foreach ($dataElements as $element) { 
$subarray = array(); 
foreach ($element->childNodes as $node) { 
    if (!$node instanceof DomElement) { 
     continue; 
    } 
    $key = $node->tagName; 
    $value = $node->textContent; 
    $subarray[$key] = $value; 
} 
$array[] = $subarray; 
// var_dump($array); // returns the array as expected 

var_dump($array[0]["barrels08"]); //how can I get this and other variables? 


} 

구조는 다음과 같이이다 : (또는 당신은 위의 하이퍼 링크를 클릭 할 수 있습니다)

-<vehicles> 
-<vehicle> 
<atvType/> 
<barrels08>10.283832</barrels08> 
<barrelsA08>0.0</barrelsA08> 
<charge120>0.0</charge120> 
<charge240>0.0</charge240> 
<city08>28</city08> 
<city08U>28.0743</city08U> 
<cityA08>0</cityA08> 
<cityA08U>0.0</cityA08U> 
<cityCD>0.0</cityCD> 
<cityE>0.0</cityE> 
<cityUF>0.0</cityUF> 
<co2>279</co2> 
<co2A>-1</co2A> 
<co2TailpipeAGpm>0.0</co2TailpipeAGpm> 
<co2TailpipeGpm>279.0</co2TailpipeGpm> 
<comb08>32</comb08> 
<comb08U>31.9768</comb08U> 
<combA08>0</combA08> 
<combA08U>0.0</combA08U> 
<combE>0.0</combE> 
<combinedCD>0.0</combinedCD> 
<combinedUF>0.0</combinedUF> 
<cylinders>4</cylinders> 
<displ>1.8</displ> 
<drive>Front-Wheel Drive</drive> 
<engId>18</engId> 
<eng_dscr/> 
<evMotor/> 
<feScore>8</feScore> 
<fuelCost08>1550</fuelCost08> 
<fuelCostA08>0</fuelCostA08> 
<fuelType>Regular</fuelType> 
<fuelType1/> 
<fuelType2/> 
<ghgScore>8</ghgScore> 
<ghgScoreA>-1</ghgScoreA> 
<guzzler/> 
<highway08>39</highway08> 
<highway08U>38.5216</highway08U> 
<highwayA08>0</highwayA08> 
<highwayA08U>0.0</highwayA08U> 
<highwayCD>0.0</highwayCD> 
<highwayE>0.0</highwayE> 
<highwayUF>0.0</highwayUF> 
<hlv>0</hlv> 
<hpv>0</hpv> 
<id>33504</id> 
<lv2>12</lv2> 
<lv4>12</lv4> 
<make>Honda</make> 
<mfrCode>HNX</mfrCode> 
<model>Civic</model> 
<mpgData>Y</mpgData> 
<phevBlended>false</phevBlended> 
<pv2>83</pv2> 
<pv4>95</pv4> 
<rangeA/> 
<rangeCityA>0.0</rangeCityA> 
<rangeHwyA>0.0</rangeHwyA> 
<trans_dscr/> 
<trany>Automatic 5-spd</trany> 
<UCity>36.4794</UCity> 
<UCityA>0.0</UCityA> 
<UHighway>55.5375</UHighway> 
<UHighwayA>0.0</UHighwayA> 
<VClass>Compact Cars</VClass> 
<year>2013</year> 
<youSaveSpend>3000</youSaveSpend> 

- 33.612226599 33,504

+0

이 코드는 예상대로 작동합니다. 'var_dump ($ array [0] [ "barrels08"]); 올바른 데이터를 덤프합니다. 너의 문제는 뭐니? –

+0

그래, 그래도 작동하는 것 같지만 var_dump ($ array [0] [ "barrelsA08"])로 변경하면; 그것은 다음 노드입니다. 오류가 발생하지 않는 한 그렇지 않습니다. 0에서 1, 2, 3 등을 변경해도 차이가없는 것처럼 보입니다. – user3270591

답변

0

데이터를 표시하고 싶다면 실제로 모든 것을 배열에 넣을 필요는 없습니다. SimpleXML은 XML 데이터를 매우 간단하게 처리합니다.

<?php 

function getFuelDataAsXml($make, $model) 
{ 
    // In most cases CURL is overkill, unless you need something more complex 
    $data = file_get_contents("https://www.fueleconomy.gov/ws/rest/ympg/shared/vehicles?make={$make}&model={$model}"); 

    // If we got some data, return it as XML, otherwise return null  
    return $data ? simplexml_load_string($data) : null; 
} 

// get the data for a specific make and model 
$data = getFuelDataAsXml('honda', 'civic'); 

// iterate over all vehicle-nodes 
foreach($data->vehicle as $vehicleData) 
{ 
    echo $vehicleData->barrels08 . '<br />'; 
    echo $vehicleData->yourMpgVehicle->avgMpg . '<br />'; 
    echo '<hr />'; 
} 
+0

고마워, 그게 내가 찾고있는 것 같아! 당신의 도움에 많은 감사드립니다! – user3270591

+0

@ user3270591 다행히 도울 수있다. :) – Quasdunk

0

는 DOM 사용 XPath는 데이터를 가져올 수 : 나는 어쩌면 덜 복잡한 솔루션을 제안 할 수 있습니다 경우

$url = "https://www.fueleconomy.gov/ws/rest/ympg/shared/vehicles?make=honda&model=civic"; 

$dom = new DomDocument(); 
$dom->load($url); 
$xpath = new DOMXpath($dom); 

foreach ($$xpath->evaluate('/*/vehicle') as $vehicle) { 
    var_dump(   
    array(
     $xpath->evaluate('string(fuelType)', $vehicle), 
     $xpath->evaluate('number(fuelCost08)', $vehicle), 
     $xpath->evaluate('number(barrels08)', $vehicle) 
    ) 
); 
} 

대부분의 XPath 표현식은에게 foreach 문을 사용하여 반복 할 수있는 노드의 목록을 반환합니다. number() 또는 string()을 사용하면 첫 번째 노드의 값 또는 내용을 부동 또는 문자열로 변환합니다. 목록이 비어 있으면 빈 값을 얻게됩니다.