PHP + XPath 查询获取子节点及其值 [英] PHP + XPath Query get Child Nodes and their values

查看:30
本文介绍了PHP + XPath 查询获取子节点及其值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a XML file record.xml which looks like:

<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> 的所有子节点名称以及关联数组中所有这些子节点的值.

I want to write a xpath query which will return all the child nodeName of <record> and value of all these child nodes in an associative array.

例如:

对于上面的 XML 文件输出数组应该是-

For above XML file Output array should be-

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' 
            }
}

下面是我编写的代码的一部分,返回所有 子节点值,但不返回它们的节点名称.

Below is part of Code I written this return all the <record> child nodes values but not their node name.

    .......
    .......
    $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 查询,它将返回子节点名称及其值.

I just want a Xpath query which will return child node names along with their values.

推荐答案

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

Problem is a record as a node is just part of the node hierarchy. What you're getting is all records, however you also want to descend and get the data from the record's child nodes. A very case specific example is :

<?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: This solution is very case specific and would probably break if you have additional nested hierarchies (which I recommend you do in order to store the multiple subjects).

这篇关于PHP + XPath 查询获取子节点及其值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆