Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Action script 2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=49)
-   -   Научите сделать рекурсию по данным импортированных с xml файла (http://www.flasher.ru/forum/showthread.php?t=65135)

Onic 23.11.2004 13:24

Научите сделать рекурсию по данным импортированных с xml файла
 
Есть файл, приблизительно:
Код:

<?xml version="1.0" encoding="Windows-1251"?>
<menu_list>
        <restoraund>
                        <menu_element>data</menu_element>
                        <menu_element>data</menu_element>
                        <menu_element>data</menu_element>
                        <menu_element>data</menu_element>
                        ...
        </restoraund>
        <magaziund>
                <podmenu_element>
                                <menu_element>data</menu_element>
                                <menu_element>data</menu_element>
                                <menu_element>data</menu_element>
                                ...
                </podmenu_element>
                        <menu_element>data</menu_element>
                        <menu_element>data</menu_element>
                        <menu_element>data</menu_element>
                        ...
        </magaziund>
</menu_list>

Сколько у него елементов и вложений заранее не известно.
Как вывести командой trace() все значения?
Буду очень благодарин, тому кто поможет.

Onic 23.11.2004 16:03

Вот переписываю из учебника функцию рекурсии obhod(), подсчитывающую количество узлов в документе.
Она получает ссылку на узел и увеличивает значение переменной-счетчика на единицу. Затем она проверяет, есть ли у узла дочерние узлы. Если они есть, то создается еще одна активация функции и ей передается ссылка на первый дочерний узел. Далее функция проверяет, имеется ли узел, который был бы прописан после данного. Если он обнаруживается, то ссылка на него передается новой активации obhod().

Код:

var myXML:XML=new XML("<text><t1/><data>привет</data><t3/></text>");
var col:Number=0;
function obhod(node:XMLNode):Void {
        col++;
        if (node.hasChildNodes()) {
                obhod(node.firstChild);
        }
        if (node.nextSibling != null) {
                obhod(node.nextSibling);
        }
}
obhod(myXML.firstChild);
trace(col); //Выводит 5

Теперь немного изменим код:
Код:

var myXML = new XML();
myXML.load("myxml.xml");
var col:Number=0;
myXML.onLoad = function() {
function obhod(node:XMLNode):Void {
        col++;
        if (node.hasChildNodes()) {
                obhod(node.firstChild);
        }
        if (node.nextSibling != null) {
                obhod(node.nextSibling);
        }
}
obhod(myXML.firstChild);
trace(col); //Выводит 0 ЧТО НЕ ПРАВИЛЬНО
}

Содержимое файла myxml.xml такое:
Код:

        <LES>
                <dub>
                        <vetochka1>
                                <listik1/>
                                <listik2/>
                                <listik3/>
                        </vetochka1>
                        <vetochka2/>
                        <duplo vduple="meda polno"/>
                </dub>
                <sosna>
                        <krona>
                                <igolka1/>
                                <igolka2/>
                                <igolka100/>
                        </krona>
                </sosna>
                <lipa>
                        <vetochka1 pochka="4"/>
                        <vetochka2 pochka="10"/>
                        <vetochka3 pochka="0"/>
                </lipa>
                <kamen oblom="у него есть остаток какого-то хрена"/>
        </LES>

Помогите найти Ошибку!!!

Onic 23.11.2004 16:08

Я уже попробовал ради интереса в файл myxml.xml вписать <text><t1/><data>привет</data><t3/></text>, но результат остался тот же, колличество узлов = 0.

Onic 23.11.2004 17:36

Вот модифицировал код. Хотел получить значения нодов.
Код:

var myXML:XML = new XML("<text><t1/><data2>привет</data2><t3/><t4/>
<data5>привет5</data5><t6/>
<data7><m1>YO!</m1></data7><t8/>
<data9><m2><mv>UPS!</mv></m2></data9><t10/></text>");
var col:Number = 0;
// счетчик, выдает колличество узлов в данных (18 в данном случае)
function obhod(node:XMLNode):Void {
        col++;
        if (node.hasChildNodes()) {
                //trace(node.firstChild);
                obhod(node.firstChild);
        }
        if (node.nextSibling != null) {
                //trace(node.nextSibling);
                //trace(node.nextSibling.nodeName);
                //trace(node.nextSibling.nodeValue);
                if (node.firstChild != null) {
                        trace(node.firstChild); //выводит содержание нода в окно Output
                }
                obhod(node.nextSibling);
        }
}
obhod(myXML.firstChild);
trace(col);
/* поскольку счетчик считает все узлы (любой вложенности), значит он полностью
обходит дерево и можно узнать колличество вложений.
Не получается все же вывести ЛЮБЫЕ вложения, выводит ноды (<m1>YO!</m1>).
*/

Можно просто скопировать и вставить в новый флеш файл, что бы увидеть.

Но ВСЕ РАВНО не работает, если данные грузятса из внешнего myxml.xml, даже если они в нем едентичны.

Уже не знаю что делать. Как только не пытался :(
Я плякать :rolleyes:

Linuxoid_Alex 24.11.2004 09:13

количество подузлов мона получить через childNodes.length
Обход дерева:
Код:

function GetTree(node)
{
  if (node.childNodes.length!=0)
  {
    for (var i=0;i<node.childNodes.length;i++)
    {
      if (node.childNodes[i].nodeValue!=undefined)
      {
        trace(node.childNodes[i].nodeName);
        trace(node.childNodes[i].nodeValue);
      }
      GetTree(node.childNodes[i]);
    }
  }
}
doc = new XML();
doc.load('data.xml');
doc.onLoad = function()
{
  GetTree(doc.firstChild);
}

За работоспособность не отвечаю, не проверял

Onic 25.11.2004 15:23

не получилось. потому что
trace(childNodes.length);
выводит 0

:(
хотя в ListVariables
Код:

Level #0:
Variable _level0.$version = "WIN 7,0,19,0"
Variable _level0.GetTree = [function 'GetTree']
Variable _level0.doc = [object #2] {
   
      <LES>
        <dub>
          <vetochka1>
            <listik1 />
            <listik2 />
            <listik3 />
          </vetochka1>
          <vetochka2 />
          <duplo vduple="meda polno" />
        </dub>
        <sosna>
          <krona>
            <igolka1 />
            <igolka2 />
            <igolka100 />
          </krona>
        </sosna>
        <lipa>
          <vetochka1 pochka="4" />
          <vetochka2 pochka="10" />
          <vetochka3 pochka="0" />
        </lipa>
        <kamen oblom="у него есть остаток какого-то хрена, наверно девки, что на речку бегали да поотломали для забавы" />
      </LES>
  }


Штрек 26.11.2004 03:06

Чего Америку изобретать..
Сюда
или
сюда


Часовой пояс GMT +4, время: 05:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.