我有一个XML文件加载到DOM文档中, 我想迭代所有'foo'标签,从它下面的每个标签获取值。我知道我可以通过
获得价值$element = $dom->getElementsByTagName('foo')->item(0);
foreach($element->childNodes as $node){
$data[$node->nodeName] = $node->nodeValue;
}
然而,我正在尝试做的是来自XML,
<stuff>
<foo>
<bar></bar>
<value/>
<pub></pub>
</foo>
<foo>
<bar></bar>
<pub></pub>
</foo>
<foo>
<bar></bar>
<pub></pub>
</foo>
</stuff>
遍历每个 foo 标记,并获取特定的 bar 或 pub ,并从中获取值。 现在,如何迭代 foo 以便我仍然可以按名称访问特定的子节点?
答案 0 :(得分:43)
未经测试,但是:
$elements = $dom->getElementsByTagName('foo');
$data = array();
foreach($elements as $node){
foreach($node->childNodes as $child) {
$data[] = array($child->nodeName => $child->nodeValue);
}
}
答案 1 :(得分:4)
使用XPath查询文档通常比编写依赖于文档结构知识的代码要好得多。有两个原因。首先,测试和调试的代码要少得多。其次,如果文档的结构发生变化,那么更改XPath查询要比更改一堆代码容易得多。
当然,你必须学习XPath,但(大部分)XPath不是火箭科学。
PHP的DOM使用xpath_eval
方法执行XPath查询。它记录在here,用户注释包括一些很好的例子。
答案 2 :(得分:2)
这是另一种(懒惰)方式。
$data[][$node->nodeName] = $node->nodeValue;
答案 3 :(得分:0)
使用FluidXML,您可以非常轻松地查询和迭代XML。
$data = [];
$store_child = function($i, $fooChild) use (&$data) {
$data[] = [ $fooChild->nodeName => $fooChild->nodeValue ];
};
fluidxml($dom)->query('//foo/*')->each($store_child);