我有一些格式如下的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 '';
}
}
如何获得&#34; Some Name Here 3&#34;?
的价值我不能使用$ item [3]这样的东西,因为有各种数量的物品。
答案 0 :(得分:1)
这听起来像是xpath的工作:
//ITEM[NAME="Some Name Here 3"]
将获取所需的元素节点。 DOMDocument和SimpleXMLElement都支持xpath。我会留给您选择您要使用的那个。
答案 1 :(得分:1)
如果你问我(或kojiro),这是一个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;