Обход XML-дерева. Запутался...

ilkz

Новичок
Обход XML-дерева. Запутался...

Всем привет!
А у нас, тпа, солнышко на улице! :)

К делу. Заморочился написать функцию для построения дерева-массива на основе XML-дерева. Что есть:
XML-файл примерно такого содержания:
PHP:
<?xml version="1.0" encoding="windows-1251"?>
<essence id="ESSENCE_ID">
         <title>TITLE</title>
         <date>DATE</date>
         <source url="SOURCE_URL">SOURCE</source>
         <icon width="ICON_WIDTH" height="ICON_HEIGHT" url="ICON_URL"/>
         <description>DESCRIPTION</description>
         <data>DATA</data>
         <comments>
                   <comment id="COMMENT_ID">
                            <name url="NAME_URL">COMMENT_NAME</name>
                            <date>COMMENT_DATE</date>
                            <text>COMMENT_TEXT</text>
                   </comment>
         </comments>
</essence>
Функция, ессно, рекурсивна. Вот ее код:
PHP:
function walkTree($node, $result, $prevnode=NULL){
  for($i=0;$i < $node->childNodes->length;$i++){
    $newnode=$node->childNodes->item($i);
    if($newnode->nodeType==XML_ELEMENT_NODE && $newnode->childNodes->length > 0){
      echo $newnode->nodeName;
      walkTree($newnode,$result, $node);
    }
    elseif($newnode->nodeType==XML_TEXT_NODE){
      if(trim($newnode->nodeValue)!="")  echo "=".$newnode->nodeValue." (parent_node=".$prevnode->nodeName.")\n";
    }
    elseif($newnode->childNodes->length == 0){
      echo $newnode->nodeName." (parent_node=".$node->nodeName.")\n";
    }
  }
}
Вызывается так:
PHP:
$xmlfile="essence.xml";
$xml = new DOMDocument('1.0', 'windows-1251');
$xml->load($xmlfile);
$root=$xml->getElementsByTagName("essence")->item(0);
$result=array();
echo "<pre>";
walkTree($root, $result);
echo "</pre>";
Но. Все бы ничего, да возникла проблема, которая меня просто выводит из себя! Вот она. Каким образом можно определить, что ВЕТВЬ дерева, например comment, является потомком узла comments? Че-то не втыкаю...

Может, у кого есть такая процедурка?
Спасибо за внимание!
 

ilkz

Новичок
Пока что все просто выводится в браузер. Суть проблемы в том, что то, что есть сейчас, не может сообразить, что, например, листьевые узлы name, data и text ветви comment принадлежат ей, а сама эта ветвь - принадлежит ветви comments...
Иными словами, не выполняется принцип иерархичности дерева...

-~{}~ 10.05.06 19:50:

Вот вывод скрипта:
PHP:
title=TITLE (parent_node=essence)
date=DATE (parent_node=essence)
source=SOURCE (parent_node=essence)
icon (parent_node=essence)
description=DESCRIPTION (parent_node=essence)
data=DATA (parent_node=essence)
commentscommentname=COMMENT_NAME (parent_node=comment)
date=COMMENT_DATE (parent_node=comment)
text=COMMENT_TEXT (parent_node=comment)
 

bgm

&nbsp;
А ты не выводи "просто в браузер" - данная конкретная функция должна возвращать результат, поэтому подумай, что должна возвращать эта рекурсивная функция и всё сразу станет ясно.
 
Сверху