繁体   English   中英

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

[英]Get children of document element through php domdocument parser

好的,这是一个非常常见的 xml 解析方法,获取子节点,但它对我来说不起作用......

不能在这里得到我的根元素的childNodes数组,但我可以从任何其他节点得到它,当他们有了孩子,这不是一个问题。 每当我遇到从这个文档元素获取 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>

这对我有用...

$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" />

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM