Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Оболочка XML. (http://www.flasher.ru/forum/showthread.php?t=111273)

Ruffus 20.04.2008 21:29

Оболочка XML.
 
Пишу класс, наследующий XML. Хочу добавить методы свои и стойства.
Код:

class hvClasses.CDataNode extends XML
{
        private var xmlData:XML;
.............
        public function byStr(index:String):CDataNode
        {
                var res:CDataNode = null;
                for (var i = 0; i<=xmlData.childNodes.length-1; i++)
                {
                        if (xmlData.childNodes[i].nodeName == index)
                        {
                                res = CDataNode(xmlData.childNodes[i]);
                                break;
                        }
                }
                return res;
        }

Конструирование, насколько можно судить по результатам последующей загрузки данных, проходит. Результаты я смотрю соответственно так:
Код:

var myNode = new CDataNode();
myNode.ignoreWhite = true;
myNode.loadFromFile("circus.xml");
myNode.onLoad = function(success) {
//        trace(myNode);
        trace(myNode.status);
        trace(myNode.byStr('body'));
//        trace('count ' + myNode.byStr('body').byStr('hall').count);
//        trace('attrs ' + myNode.byStr('body').byStr('hall').attrCount);
//        trace('depth ' + myNode.byStr('body').byStr('hall').depth(true));
}

Но метод byStr мало того, что не работает, при попытке дебажить ваще виснет всё напрочь и схлопывается потом. loadFromFile - тоже переписанный метод, и если его поставить в конец блока - ничего не изменится.

silin 20.04.2008 22:35

глянь, такой тест вполне себе работает:
Код:

class CDataNode extends XML
{
        public function CDataNode(text:String)
        {
                super(text);
        }
        public function byStr(index:String):CDataNode
        {
                for (var i = 0; i<=childNodes.length; i++)
                {
                        var node:CDataNode = childNodes[i];
                        if (node.nodeName == index)
                        {
                                return node;
                        }
                }
                return null;
        }
}

Код:

var myXML:CDataNode = new CDataNode("<body>test</body>");
var bodyNode:CDataNode = myXML.byStr("body");
trace( "bodyNode : " + bodyNode );//bodyNode : <body>test</body>

что происходит у тебя из этих обрывков ни понять не протестировать невозможно..

Ruffus 21.04.2008 16:43

Спасибо, работает.
Получается, что явное приведение типов не срабатывает, а срабатывает неявное.
А если мне надо написать что-то типа
Код:

public function get parent():СDataNode
        {
                return СDataNode(this.parentNode);
        }

Тут вроде неявное не прокатывает уже, потому что у parentNode тип не XML, а XMLNode.

Ruffus 22.04.2008 10:52

Непонятно, почему метод byStr не даёт себя вызвать 2 раза подряд, например:
Код:

var node:DataNode = myNode.byStr('body').byStr('info');
trace(node.nodeName);

Никакие попятки приведения типов в методах parent и root почему-то не срабатывают.

silin 22.04.2008 12:41

ты прав, надо внимательнее с типами
byStr в предыдущем варианте возвращает XMLNode, а не CDataNode, декларация var node:CDataNode = childNodes[i]; ничего не дает, компилятор просто не может проверить тип childNodes[i]..
должно быть, видимо, так (хотя и не очень понятно зачем оно) :
Код:

class CDataNode extends XML
{
        public function CDataNode(text:String)
        {
                super(text);
        }
        public function byStr(index:String):CDataNode
        {
                for (var i = 0; i<=childNodes.length; i++)
                {
                        var node:XMLNode = childNodes[i];
                        if (node.nodeName == index)
                        {
                                var newCDataNode:CDataNode = new CDataNode(node.firstChild.toString());
                                return newCDataNode;
                        }
                }
                return null;
        }
}


Ruffus 22.04.2008 16:20

А зачем тут firstChild в аргументе конструктора?

silin 22.04.2008 16:44

дада, сори
действительно, нужны же все дети:
Код:

class CDataNode extends XML
{
        public function CDataNode(text:String)
        {
                super(text);
        }
        public function byStr(index:String):CDataNode
        {
                for (var i = 0; i<=childNodes.length; i++)
                {
                        var node:XMLNode = childNodes[i];
                        if (node.nodeName == index)
                        {
                                var xmlStr:String = node.childNodes.join("");
                                var newCDataNode:CDataNode = new CDataNode(xmlStr);
                                return newCDataNode;
                        }
                }
                return null;
        }
}


Ruffus 22.04.2008 16:50

Блин, при реализации через toString() как -то не так всё получается, внешний узел имени не имеет, ему соответствующий текст из документа попадает в содержимое узла...

Спасибо.
Но вообще, при создании новых объектов связи теряются с родительскими
элементами, дерево ломается. Надо как-то по-дургому выпутываться..

silin 22.04.2008 17:15

мне кажется нелогично в такой затее наследоваться от XML, имхо от XMLNode было бы складнее..
а так получаешь, то что есть..

Ruffus 22.04.2008 22:19

Блин, так куда денутся проблемы с приведением типов?
Кроме того, я потеряю status и onLoad, к примеру.

silin 22.04.2008 22:41

может есть смысл посмотреть в сторону готовых парсеров xml ..
здесь, например

ps. не берусь чего-либо советовать, потому как не вполне в теме..
да к тому ж так и не понял зачем ты это все городишь..

wvxvw 23.04.2008 03:32

Ну уж если пытаться сделать что-то похожее на АС3шный ХML, так есть и готовые варианты... ну и если копировать, так уж полностью, и ХML и ХMLlist. Т.е ХML наследовать от ХMLNode, а лист, ну, как вариант, от Array, ну, не знаю, или от Object вообще...

Ruffus 23.04.2008 10:36

Мне нужен расширенный вариант XML, со всякими удобностями, чтобы использовать его в других классах своих.

Ruffus 26.04.2008 11:54

Спасибо всем.
Я сделал класс с набором статических методов, с оболочкой морочиться не стал.


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

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