php xpath迭代内部节点,根据特定属性获取值

时间:2015-02-14 16:25:35

标签: php xpath attributes

我有一个以下结构的XML文档。

<rows pos="0" rec_count="200">
    <row id="109">
        <cell style="" fieldName="pid">104</cell>
        <cell style="" fieldName="title">Mr.</cell>
        <cell style="" fieldName="name">Vladimir</cell>
        <cell style="" fieldName="projectcode">879</cell>
        <cell style="" fieldName="clientstatus">1000000000</cell>
    </row>
    <row id="111">
        <cell style="" fieldName="pid">105</cell>
        <cell style="" fieldName="title">Mr.</cell>
        <cell style="" fieldName="name">Barak</cell>
        <cell style="" fieldName="projectcode">789/cell>
        <cell style="" fieldName="clientstatus">1000000000</cell>
    </row>
</rows>   

现在我需要获取每一行的值到一个数组,其中每个行元素是一个关联数组,其中fieldName是上面的键,元素值是节点值。

如何使用XPath完成此操作?

我尝试了几种方法;没有人对我有用。

感谢@JeffreyBosboom,@ Makyen回复。

我最成功的是如下。

foreach ($xml->xpath('//row') as $node) {
    foreach($node->cell as $cell) { 
        var_dump((string)$cell[0]);
    }
} 

有了它,我可以获得节点值。但我需要在每次迭代中提取fieldName属性

1 个答案:

答案 0 :(得分:1)

你的意思是这样的:

$arr = array();
$s = simplexml_load_string($xml);

//First we search all the <cell> nodes within <row> nodes 
foreach($s->xpath("//row/cell") as $node)
{
    //For all found nodes we retrieve its ID from ancestor (<row>) 
    //attribute named id
    $id = $node->xpath("../@id");
    $id = (int)$id[0];
    if(!isset($arr[$id]))
    {
        $arr[$id] = array();
    }

    //Then we iterate through all attributes of found <cell> nodes
    //to find the attribute named fieldName
    foreach($node->attributes() as $key=>$att)
    {
        if($key=='fieldName')
        {
            $arr[$id][(string)$att] = (string)$node;
        }

    }   
}

//In $arr array there will be desired output
echo "<pre>";
print_r($arr);
echo "</pre>";