如何在PHP中迭代DOM元素?

2022-08-30 14:17:29

我有一个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 标记,获取特定的 barpub,并从中获取值。现在,我如何迭代foo,以便我仍然可以通过名称访问特定的子节点?


答案 1

未经测试,但怎么样:

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

答案 2

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

当然,你必须学习XPath,但(大多数)XPath不是火箭科学。

PHP 的 DOM 使用该方法来执行 XPath 查询。它记录在这里,用户注释包括一些非常好的例子。xpath_eval


推荐