2014-06-09 29 views
0

我正在嘗試使用PHP從XML中讀取一些值。但事情是我想與下面的變量名讀他們 -讀取帶有變量名稱的xml值

<?php 

    $xml = '<RESPONSE type=\"WEBRESPONSE\"> 
     <NAME>ALBERT</NAME> 
     <HTTPSTATUS>200</HTTPSTATUS> 
     <VALUES> 
      <VALUE1>ABCD</VALUE1> 
      <VALUE2>DEFG</VALUE2> 
      <VALUE3>HIJK</VALUE3> 
     </VALUES> 
    </RESPONSE>'; 

    $responseMappings = array(
     "VALUE1","VALUE2","VALUE3" 
     ); 

    $xmlResponse = @simplexml_load_string ($xml); 
    $values = $xmlResponse->VALUES; 
    foreach($responseMappings as $responseMapping){ 
      //Refer using variable name below? How to? 
     echo "Value : ".($values->${responseMapping}); 
    } 
?> 

我想提及或$values挑選使用變量名$responseMapping值。我不知道我該怎麼做。

任何幫助將不勝感激。

回答

1

你接近,但兩件事情:

  1. 第一XML是無效的(看起來就像一些拼寫錯誤,因爲你沒有檢查你的示例代碼)。當你壓制這些錯誤時,你需要啓用錯誤日誌並跟蹤錯誤日誌。修復這些。

  2. 然後收拾你怎麼辦變量屬性訪問,(一)正確的代碼是:

    echo "Value : " . $values->{$responseMapping}; 
    

典型的輸出由:

Value : ABCD 
Value : DEFG 
Value : HIJK 

查看完整的工作代碼示例(run it as an online demo):

<?php 
/** 
* @link http://stackoverflow.com/a/24116883/367456 
* @link https://eval.in/160030 
*/ 

$xml = ' 
<RESPONSE type="WEBRESPONSE"> 
    <NAME>ALBERT</NAME> 
    <HTTPSTATUS>200</HTTPSTATUS> 
    <VALUES> 
     <VALUE1>ABCD</VALUE1> 
     <VALUE2>DEFG</VALUE2> 
     <VALUE3>HIJK</VALUE3> 
    </VALUES> 
</RESPONSE>'; 

$responseMappings = array(
    "VALUE1", "VALUE2", "VALUE3" 
); 

$xmlResponse = simplexml_load_string($xml); 
if (!$xmlResponse) { 
    throw new RuntimeException('Failed to open XML'); 
} 

$values  = $xmlResponse->VALUES; 
foreach ($responseMappings as $responseMapping) { 
    //Refer using variable name below? How to? 
    echo "Value : " . $values->{$responseMapping}, "\n"; 
} 

但是如果你讓我一些額外的想法:

想的不一樣:所有這三個<VALUE?>元素對在平常的事:他們是<VALUES>子元素。這樣做你將不需要保留元素名稱的數組。

用於該場景的示例性輸出:

Value "VALUE1": ABCD 
Value "VALUE2": DEFG 
Value "VALUE3": HIJK 

這裏是另一個workign代碼示例(run it as an online demo):

<?php 
/** 
* @link http://stackoverflow.com/a/24116883/367456 
* @link https://eval.in/160032 
*/ 

$xml = ' 
<RESPONSE type="WEBRESPONSE"> 
    <NAME>ALBERT</NAME> 
    <HTTPSTATUS>200</HTTPSTATUS> 
    <VALUES> 
     <VALUE1>ABCD</VALUE1> 
     <VALUE2>DEFG</VALUE2> 
     <VALUE3>HIJK</VALUE3> 
    </VALUES> 
</RESPONSE>'; 


$xmlResponse = simplexml_load_string($xml); 
if (!$xmlResponse) { 
    throw new RuntimeException('Failed to open XML'); 
} 

/** @var SimpleXMLElement $values */ 
$values = $xmlResponse->VALUES; 
foreach ($values->children() as $name => $value) { 
    //Refer using variable name below? How to? 
    printf("Value \"%s\": %s\n", $name, $value); 
} 
0

替代,你可以做這樣的事情。考慮下面這個例子:

$xml = '<RESPONSE type="WEBRESPONSE"> 
    <NAME>ALBERT</NAME> 
    <HTTPSTATUS>200</HTTPSTATUS> 
    <VALUES> 
     <VALUE1>ABCD</VALUE1> 
     <VALUE2>DEFG</VALUE2> 
     <VALUE3>HIJK</VALUE3> 
    </VALUES> 
</RESPONSE>'; 

$responseMappings = array("VALUE1","VALUE2","VALUE3"); 
$data = array(); 
$xmlResponse = simplexml_load_string($xml); 
$xmlResponse = json_decode(json_encode($xmlResponse), true); 
foreach($responseMappings as $key => $value) { 
    $data[$value] = $xmlResponse['VALUES'][$value]; 
} 

echo '<pre>'; 
print_r($data); 
echo '</pre>'; 

樣本輸出:

Array 
(
    [VALUE1] => ABCD 
    [VALUE2] => DEFG 
    [VALUE3] => HIJK 
) 
0

嘗試foreach()array_merge()

$xml = '<RESPONSE type="WEBRESPONSE"> 
     <NAME>ALBERT</NAME> 
     <HTTPSTATUS>200</HTTPSTATUS> 
     <VALUES> 
      <VALUE1>ABCD</VALUE1> 
      <VALUE2>DEFG</VALUE2> 
      <VALUE3>HIJK</VALUE3> 
     </VALUES> 
    </RESPONSE>'; 
$xmlResponse = simplexml_load_string($xml); 
$values = $xmlResponse->VALUES; 
$responseMapping = array(); 
foreach($values as $k => $v){ 
    $responseMappings[$k] = $v; 
} 
$responseMapping = array_merge($responseMapping,(array)$responseMappings['VALUES']); 
print_r($responseMapping); //Array([VALUE1] => ABCD [VALUE2] => DEFG [VALUE3] => HIJK) 
相關問題