PDA

Просмотр полной версии : Оболочка XML.


Ruffus
20.04.2008, 21:29
Пишу класс, наследующий 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 ..
здесь (http://osflash.org/xpath4as2), например

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
Спасибо всем.
Я сделал класс с набором статических методов, с оболочкой морочиться не стал.