Просмотр полной версии : Оболочка 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 - тоже переписанный метод, и если его поставить в конец блока - ничего не изменится.
глянь, такой тест вполне себе работает:
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>
что происходит у тебя из этих обрывков ни понять не протестировать невозможно..
Спасибо, работает.
Получается, что явное приведение типов не срабатывает, а срабатывает неявное.
А если мне надо написать что-то типа
public function get parent():СDataNode
{
return СDataNode(this.parentNode);
}
Тут вроде неявное не прокатывает уже, потому что у parentNode тип не XML, а XMLNode.
Непонятно, почему метод byStr не даёт себя вызвать 2 раза подряд, например:
var node:DataNode = myNode.byStr('body').byStr('info');
trace(node.nodeName);
Никакие попятки приведения типов в методах parent и root почему-то не срабатывают.
ты прав, надо внимательнее с типами
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;
}
}
А зачем тут firstChild в аргументе конструктора?
дада, сори
действительно, нужны же все дети:
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;
}
}
Блин, при реализации через toString() как -то не так всё получается, внешний узел имени не имеет, ему соответствующий текст из документа попадает в содержимое узла...
Спасибо.
Но вообще, при создании новых объектов связи теряются с родительскими
элементами, дерево ломается. Надо как-то по-дургому выпутываться..
мне кажется нелогично в такой затее наследоваться от XML, имхо от XMLNode было бы складнее..
а так получаешь, то что есть..
Блин, так куда денутся проблемы с приведением типов?
Кроме того, я потеряю status и onLoad, к примеру.
может есть смысл посмотреть в сторону готовых парсеров xml ..
здесь (http://osflash.org/xpath4as2), например
ps. не берусь чего-либо советовать, потому как не вполне в теме..
да к тому ж так и не понял зачем ты это все городишь..
Ну уж если пытаться сделать что-то похожее на АС3шный ХML, так есть и готовые варианты... ну и если копировать, так уж полностью, и ХML и ХMLlist. Т.е ХML наследовать от ХMLNode, а лист, ну, как вариант, от Array, ну, не знаю, или от Object вообще...
Мне нужен расширенный вариант XML, со всякими удобностями, чтобы использовать его в других классах своих.
Спасибо всем.
Я сделал класс с набором статических методов, с оболочкой морочиться не стал.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.