首页 文章

PHP XPath Query获取子节点及其值

提问于
浏览
2

我有一个XML文件record.xml,它看起来像:

<record>
    <name>john</name>
    <gender>male</gender>
    <subject>mathematics, english, science</subject>
</record>
<record>
    <name>jamie</name>
    <gender>female</gender>
    <subject>mathematics, science</subject>
</record>
<record>
    <name>jack</name>
    <gender>male</gender>
    <subject>social-science, english</subject>
</record>

我想编写一个xpath查询,它将返回 <record> 的所有子nodeName和关联数组中所有这些子节点的值 .

例如:对于上面的XML文件输出数组应该是 - array {
[0] =>数组{
[name] ='john',
[性别] ='男性',
[subject] ='数学,英语,科学'
}
[1] =>数组{
[name] ='jamie',
[性别] ='女性',
[subject] ='数学,科学'
}
[2] => array {
[name] ='jack',
[性别] ='男性',
[subject] ='社会科学,英语'
}
}

下面是Code I写的一部分,它返回所有 <record> 子节点值,但不返回它们的节点名 .

.......
    .......
    $xmldoc = new DOMDocument();
    $xmldoc->load('record.xml');
    $xpathvar = new Domxpath($xmldoc);
    $res = $xpathvar->query('//record');
    foreach($res as $data){
            //$data do not contain node values
           $arr[] = $data->textContent;
    }
    //process $arr to get required format
     .....
     .....

我只想要一个Xpath查询,它将返回子节点名称及其值 .

1 回答

  • 4

    问题是记录,因为节点只是节点层次结构的一部分 . 你得到的是所有记录,但是你也希望下降并从记录的子节点获取数据 . 一个非常具体的例子是:

    <?php     
    $xmldoc = new DOMDocument();
    $xmldoc->load('record.xml');
    $xpathvar = new Domxpath($xmldoc);
    $res = $xpathvar->query('//record');
    foreach($res as $data){
        $narr = [];
        foreach ($data->childNodes as $cnode) {
            $narr[$cnode->nodeName] = $cnode->nodeValue;
        }
        $arr[] = $narr;
    
    }    
    print_r($arr);
    

    应输出如下内容:

    Array
    (
        [0] => Array
            (
                [name] => john
                [gender] => male
                [subject] => mathematics, english, science
            )
    
        [1] => Array
            (
                [name] => jamie
                [gender] => female
                [subject] => mathematics, science
            )
    
        [2] => Array
            (
                [name] => jack
                [gender] => male
                [subject] => social-science, english
            )
    
    )
    

    NOTE: 此解决方案非常具体,如果您有其他嵌套层次结构可能会中断(我建议您这样做以存储多个主题) .

相关问题