32

我有一个加载到 DOM 文档中的 XML 文件,我希望遍历所有“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以便我仍然可以按名称访问特定的子节点?

4

4 回答 4

45

没有测试,但是怎么样:

$elements = $dom->getElementsByTagName('foo');
$data = array();
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $data[] = array($child->nodeName => $child->nodeValue);
    }
}
于 2008-10-10T15:56:45.183 回答
4

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

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

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

于 2008-10-10T20:23:36.923 回答
2

这是另一种(懒惰的)方法。

$data[][$node->nodeName] = $node->nodeValue;
于 2008-12-09T16:29:40.690 回答
-2

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

$data = [];

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

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

https://github.com/servo-php/fluidxml

于 2016-01-24T01:15:07.603 回答