PHP + XPath 查询获取子节点及其值 [英] PHP + XPath Query get Child Nodes and their values
问题描述
我有一个 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屋!