如何使用php xpath获取所有属性

时间:2013-05-20 09:25:23

标签: php xml xpath

我有一个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

我怎么能得到这个?

2 个答案:

答案 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