我有一个XML文件: -
<products>
<product_id value="1">
<tab_id value="251">
<dist_region value="5" />
<dist_region value="10066" />
<dist_region value="10069" />
</tab_id>
</product_id>
</products>
我使用这个xpath: -
list($prid) = $product->xpath("//dist_region[@value]/@value");
$prid=(string)$prid;
if(strlen(trim($prid))==0)
{
echo ' Is not Match In Product';
exit;
}
echo $prid;
并获得输出: -
5
我想输出如下: - 所有dist_region都像: -
5,10066,10069
我怎么能得到这个?
答案 0 :(得分:3)
您必须循环搜索结果:
$result = $product->xpath('//dist_region[@value]/@value');
$result_arr = array();
if(!empty($result)) {
foreach($result as $prid) {
$prid = (string) $prid;
if(strlen(trim($prid)) > 0) {
$result_arr[] = $prid;
}
}
}
echo implode(',', $result_arr);
答案 1 :(得分:2)
根据你接受的答案,看起来你正在寻找所有非空的 value
- 属性。但与回答的内容不同,您实际上可以通过不同地制定xpath表达式来节省循环:
$expression = '//dist_region/@value[normalize-space(.)]';
$values = $product->xpath($expression);
echo implode(',', $values);
该xpath表达式意味着:查询具有非空的任何 value
-element-nodes的所有 dist_region
- 属性节点(非零长度)normalized string value(类似到trim()
in PHP,如果您需要修剪,则非常适合此处。
如本例所示,不需要实际循环结果,在SimpleXML中,您可以以数组的形式从xpath查询返回属性节点,并在字符串上下文中轻松使用它们(将它们转换为字符串),例如,使用implode()
function。