如何在PHP中迭代DOM元素?

如何在PHP中迭代DOM元素?,php,xml,dom,Php,Xml,Dom,我将一个XML文件加载到DOM文档中, 我希望遍历所有“foo”标记,从它下面的每个标记中获取值。我知道我可以通过 $element = $dom->getElementsByTagName('foo')->item(0); foreach($element->childNodes as $node){ $data[$node->nodeName] = $node->nodeValue; } 但是,我要做的是,从一个XML <stuff>

我将一个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上迭代,以便仍然可以按名称访问特定的子节点?

未测试,但如何:

$elements = $dom->getElementsByTagName('foo');
$data = array();
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $data[] = array($child->nodeName => $child->nodeValue);
    }
}

使用XPath查询文档通常比编写依赖于文档结构知识的代码要好得多。有两个原因。首先,要测试和调试的代码要少得多。其次,如果文档的结构发生更改,那么更改XPath查询要比更改一堆代码容易得多

当然,您必须学习XPath,但是(大部分)XPath不是火箭科学

PHP的DOM使用
xpath\u eval
方法执行xpath查询。这是有文档记录的,用户说明中包含了一些非常好的示例。

这里有另一种(懒惰的)方法

$data[][$node->nodeName] = $node->nodeValue;
使用,您可以非常轻松地查询和迭代XML

$data = [];

$store_child = function($i, $fooChild) use (&$data) {
    $data[] = [ $fooChild->nodeName => $fooChild->nodeValue ];
};

fluidxml($dom)->query('//foo/*')->each($store_child);

无需$elementCount。只需像这样附加到$data:$data[]=array($child->nodeName=>$child->nodeValue);成功了!我的想法太复杂了。一定很累了。根据troelskn的评论更新了代码,这就是你的意思吗?@Rory:是的,这就是我的意思。