xml解析 如何在PHP中迭代DOM元素?




php xml解析 (4)

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


没有测试,但是怎么样:

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

使用FluidXML您可以非常轻松地查询和迭代XML。

$data = [];

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

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

FluidXML


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

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

PHP的DOM使用xpath_eval方法执行XPath查询。 它here ,用户注释包括一些非常好的示例。


这是另一种(懒惰)方式。

$data[][$node->nodeName] = $node->nodeValue;






dom