2014-06-23 33 views
0

我已經格式化,像這樣一些XML數據:如何根據名稱獲取數組的值?

<ADDITIONALINFORMATION> 
    <ITEM> 
     <MULTIPLEVALUES>0</MULTIPLEVALUES> 
     <NAME>Some Name Here 1</NAME> 
     <VALUEARRAY></VALUEARRAY> 
     <VALUE>123</VALUE> 
    </ITEM> 

    <ITEM> 
     <MULTIPLEVALUES>0</MULTIPLEVALUES> 
     <NAME>Some Name Here 2</NAME> 
     <VALUEARRAY></VALUEARRAY> 
     <VALUE>abc</VALUE> 
    </ITEM> 

    <ITEM> 
     <MULTIPLEVALUES>0</MULTIPLEVALUES> 
     <NAME>Some Name Here 3</NAME> 
     <VALUEARRAY></VALUEARRAY> 
     <VALUE>456</VALUE> 
    </ITEM> 

    <ITEM> 
     <MULTIPLEVALUES>0</MULTIPLEVALUES> 
     <NAME>Some Name Here 4</NAME> 
     <VALUEARRAY></VALUEARRAY> 
     <VALUE>def</VALUE> 
    </ITEM> 
</ADDITIONALINFORMATION> 

我通過數據使用循環:

foreach($listing->ADDITIONALINFORMATION->ITEM as $item) { 

     if ($item->NAME == 'Some Name Here 3') { 
      $val = ''; 
       echo ''; 
     } 
} 

如何獲得「有些名稱在這裏3」的價值?

我不能使用像$ item [3]之類的東西,因爲有不同數量的項目。

+0

我不明白:這些值是你想得是'456'? – didierc

+0

'echo $ item-> VALUE;'如果聲明是真的..? – briosheje

回答

1

如果你問我(或小次郎)這是Xpath的工作,但你可以做到這一點完全像你這樣做已經,你只需要輸出自己的價值:

... 

$val = $item->VALUE; 
echo $val; 

... 

使用XPath你會不遺餘力遍歷的查詢已經執行的所有元素,給你已經是一個更具體的結果:

$name = 'Some Name Here 3'; 
$query = sprintf('//ITEM[NAME=%s]/VALUE', xpath_string($name)); 
list($value) = $listing->xpath($query) + [NULL]; 
echo $value; 

完整的例子:

<?php 
/** 
* @link http://stackoverflow.com/questions/24370072/how-to-get-the-value-of-an-array-based-on-its-name 
*/ 

$buffer = <<<XML 
<LISTING> 
    <ADDITIONALINFORMATION> 
     <ITEM> 
      <MULTIPLEVALUES>0</MULTIPLEVALUES> 
      <NAME>Some Name Here 1</NAME> 
      <VALUEARRAY></VALUEARRAY> 
      <VALUE>123</VALUE> 
     </ITEM> 

     <ITEM> 
      <MULTIPLEVALUES>0</MULTIPLEVALUES> 
      <NAME>Some Name Here 2</NAME> 
      <VALUEARRAY></VALUEARRAY> 
      <VALUE>abc</VALUE> 
     </ITEM> 

     <ITEM> 
      <MULTIPLEVALUES>0</MULTIPLEVALUES> 
      <NAME>Some Name Here 3</NAME> 
      <VALUEARRAY></VALUEARRAY> 
      <VALUE>456</VALUE> 
     </ITEM> 

     <ITEM> 
      <MULTIPLEVALUES>0</MULTIPLEVALUES> 
      <NAME>Some Name Here 4</NAME> 
      <VALUEARRAY></VALUEARRAY> 
      <VALUE>def</VALUE> 
     </ITEM> 
    </ADDITIONALINFORMATION> 
</LISTING> 
XML; 

/** 
* xpath string handling xpath 1.0 "quoting" 
* 
* @link http://hakre.wordpress.com/2013/07/11/mitigating-xpath-injection-attacks-in-php/ 
* 
* @param string $input 
* 
* @return string 
*/ 
function xpath_string($input) { 

    if (false === strpos($input, "'")) { 
     return "'$input'"; 
    } 

    if (false === strpos($input, '"')) { 
     return "\"$input\""; 
    } 

    return "concat('" . strtr($input, array("'" => '\', "\'", \'')) . "')"; 
} 

$listing = simplexml_load_string($buffer); 

foreach ($listing->ADDITIONALINFORMATION->ITEM as $item) { 
    if ($item->NAME == 'Some Name Here 3') { 
     $val = $item->VALUE; 
     echo $val; 
    } 
} 

$name = 'Some Name Here 3'; 
$query = sprintf('//ITEM[NAME=%s]/VALUE', xpath_string($name)); 
list($value) = $listing->xpath($query) + [NULL]; 
echo $value; 
1

這聽起來像XPath的工作:

//ITEM[NAME="Some Name Here 3"] 

將獲取所需的元素節點。 DOMDocumentSimpleXMLElement都支持xpath。我會留給你選擇你想使用哪一個。

1

使用字符串比較功能,並獲得該元素的值...

foreach($listing->ADDITIONALINFORMATION->ITEM as $item) { 
    if (strcmp($item->NAME,'Some Name Here 3') == 0) { 
     $value = $item->VALUE; 
    } 
} 
相關問題