通过php domdocument解析器获取文档元素的子元素

时间:2012-03-04 19:36:07

标签: php xml dom document

好的,这是一个非常常见的xml解析方法,获取子节点,但它只是不适用于我应该如何...

不能从我的根元素中获取一个childNodes数组,但是当我们有子节点时,我可以从任何其他节点获取它,这不是问题。每当我遇到从这个文档元素中获取子节点时,我似乎无法获得的不仅仅是第一个孩子。

我需要从文档元素中获取所有第一级节点。

$xdoc=createDOMDocument($file);
$all_children= $xdoc->documentElement->childNodes;
echo count($all_children);

function createDOMDocument($file){
    $xdoc = new DOMDocument();
    $xdoc->formatOutput = true;
    $xdoc->preserveWhiteSpace  = false;
    $xdoc->load($file);
    return $xdoc;
}

但这只会输出“1”,它找不到所有节点,当我试图输出它时,它总是在第一个节点停止。这对我来说毫无意义。

下面找到的唯一节点是:

<title>some title</title>

如果我删除那个节点,它会找到topicmeta等等,但绝不会将每个节点都放入一个我需要的数组中。

这是XML:

<?xml version="1.0" encoding="UTF-8"?>
<map title="mytitle" xml:lang="en-us">
<title>some title</title>
<topicmeta>
<prodinfo>
  <prodname>a product</prodname>
      <vrmlist>
        <vrm version="8.5"/>
      </vrmlist>
  <platform/>
</prodinfo>
 </topicmeta>
  <topichead navtitle="cat1" id="topichead4f53aeb751c875.38130575">
<topichead navtitle="another topic"/>
</topichead>
  <topichead navtitle="cat2" id="topichead4f53aeb3596990.18552413"/>
  <topichead navtitle="cat3" id="topichead4f52fd157487f9.21599660"/>
</map>

2 个答案:

答案 0 :(得分:9)

这对我有用......

$xml = new DOMDocument();
$xml->load('read.xml');

$root = $xml->documentElement;
foreach($root->childNodes as $node){
    print $node->nodeName.' - '.$node->nodeValue;
}

我必须将<topichead navtitle="cat3" id="topichead4f52fd157487f9.21599660">更改为<topichead navtitle="cat3" id="topichead4f52fd157487f9.21599660" />

答案 1 :(得分:2)

尽管我在评论中提到了一些事情,但我想我明白你要做的是什么。

这里的事情是count()不起作用。我不确定它是否是它使用的Traversable接口的限制,或者是否一般是DOM类的怪癖。 你在寻找的是:

$all_children = $xdoc->documentElement->childNodes;
echo $all_children->length;

使用->childNodes会返回DOMNodeList。如果有疑问,你可以get_class()你的变量来查看它是什么类型的对象,然后在php.net上查找。 :)