Узнать положение нода в xmlList'е

0 views
Skip to first unread message

Roma Oskolkov

unread,
May 29, 2009, 1:16:52 PM5/29/09
to ruF...@googlegroups.com
Привет всем.

Столкнулся тут с простой на вид задачкой, да не так всё просто оказалось.

Есть xml-нод.
Нужно узнать есть ли этот нод в одном XMLList'е или нет.
Если есть — то какой он по счету.

Вроде делать это можно просто вот так:

var _node:XML = new XML(<node>Hello</node>);

xmlList.(node == _node).childIndex();

Да вот только ChildIndex выдает какие-то дикие величины. 10, и так далее.
Хотя нод находится совсем не там. (в районе нуля).
Иногда childIndex выбрасывает ошибку.

Как тут лучше поступить?
Спасибо.


Daniil Tutubalin

unread,
May 29, 2009, 1:35:10 PM5/29/09
to ruF...@googlegroups.com
Выражение xmlList.(node == _node) возвращает значение типа XMLList. У
него вообще childIndex быть не должно.

Мне кажется лучше не мудрить, а записать циклом. Тем более, что все
эти E4X штучки всё равно делаются через теже самые циклы, так что
никакого выигрыша в производительности они не дают.

ralf...@mail.ru

unread,
May 29, 2009, 3:36:56 PM5/29/09
to Roma Oskolkov

если я правильно понял что требуется

то можно записать так

xmlList.(valueOf() == _node).childIndex();

-- 

С уважением,

 ralf                          mailto:ralf...@mail.ru

ralf...@mail.ru

unread,
May 29, 2009, 3:41:36 PM5/29/09
to Roma Oskolkov

p.s.

естественно при условии что 

что _node в xmlList только один



Ruslan Shestopal

unread,
May 29, 2009, 7:00:45 PM5/29/09
to ruF...@googlegroups.com
Любезный, ralf_news!
оно бы хорошо подчищать ответу а не постить его полность, предварительно декорировав в стиле рококо.
все читали и слышали вопрос. Не нужно его повторять.
 
Кстати. К автору вопроса - не очень понятно что собственно то нужно сделать...
ну так на вскидку не прикинуть ответа и понять проблемы...

http://ruslanshestopal.com | -  freelance flash developer, action script programmer and a DJ

Roma Oskolkov

unread,
Jun 2, 2009, 5:25:18 AM6/2/09
to ruF...@googlegroups.com
«Кстати. К автору вопроса - не очень понятно что собственно то нужно сделать... ну так на вскидку не прикинуть ответа и понять проблемы...»

Да собственно, задача примерна та же что и у любого рсс-ридера — взять xml и узнать какие там новые ноды, а какие старые.
Для этого сохраняется последний нод из предыдущего rss и узнается есть ли этот нод в новом rss, и под каком индексом он идет.

Sergey Kruk

unread,
Jun 3, 2009, 12:30:47 PM6/3/09
to ruF...@googlegroups.com
> Да вот только ChildIndex выдает какие-то дикие величины. 10, и так далее.

А что выдает xmlList.length() ?
Возможно, у xml, из которого получается лист стоит ignoreWhiteSpace =
false. Тогда все переводы строки и отступы превращаются в элементы
листа. Попробуйте перед созданием xmlList указать явно
xml.ignoreWhiteSpace = true.

Сергей Крук
======================================
2009/5/29 Roma Oskolkov <r.osk...@gmail.com>:


> Привет всем.
>
> Столкнулся тут с простой на вид задачкой, да не так всё просто оказалось.
>
> Есть xml-нод.
> Нужно узнать есть ли этот нод в одном XMLList'е или нет.

> Если есть -- то какой он по счету.

Олег Галабурда

unread,
Jun 3, 2009, 3:22:10 PM6/3/09
to ruF...@googlegroups.com
Здрасте!

> Да вот только ChildIndex выдает какие-то дикие величины. 10, и так далее.

Метод childIndex() возвращает позицию нода не в текущем объекте
XMLList а позицию в своём родителе.
т.е. всегда, кким бы способом узел бюыл получен, если у него есть
родительский узел, childIndex() всегда
должно возвращать одно и то же число.

К примеру, если есть такой XML:

protected var xml:XML = <root>
<child>
<descendant/>
</child>
<child>
<descendant/>
</child>
<child>
<descendant>
<ZeroIndexNode/>
<OneIndexNode/>
</descendant>
</child>
</root>;

и мы берём такой список:

var xlist:XMLList = xml..*;

то childIndex() узла OneIndexNode всё равно будет 1, хоть он и в конце листа.

var node:XML = <OneIndexNode/>;
trace(xlist.(valueOf()==node)[0].childIndex()); // 1

Поэтому лучше перебирать лист обычным for each() или while():

var i:int=0;
while(xlist[i]!=node) i++;
trace(i, xlist[i].toXMLString());

Или извратиться с таким фильтром:

var i:int=0;
var notFound:Boolean = true;
xlist.(notFound ? (valueOf()==node ? found=true : i++) : null);
trace(i, xlist[i].toXMLString(), "isFound:", i!=xlist.length);

Надеюсь, в тему.
--
Oleg Galaburda
http://blog.actualwave.com/

Denis Kolyako

unread,
Jun 3, 2009, 3:28:25 PM6/3/09
to ruF...@googlegroups.com

> Да собственно, задача примерна та же
что и у любого рсс-ридера — взять xml и
узнать какие там новые ноды, а какие
старые.
> Для этого сохраняется последний нод
> из предыдущего rss и узнается есть ли
> этот нод в новом rss, и под каком
> индексом он идет.


В rss у каждого нода есть uid.

Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://timezero.com/




Олег Галабурда

unread,
Jun 3, 2009, 3:28:17 PM6/3/09
to ruF...@googlegroups.com
> Выражение xmlList.(node == _node) возвращает значение типа XMLList. У
> него вообще childIndex быть не должно.

Должно. Если XMLList содержит всего один элемент(и только) то XMLList
повторяет все методы объекта XML.
Классно сделали, чтоб не пришлось каждый раз указывать нулевой индекс
parent.child[0].attributes();
node.@attribute[0] = "value";

KonstantinKohl

unread,
Jun 4, 2009, 6:52:14 AM6/4/09
to ruF...@googlegroups.com
Если речь идет о RSS - там много полезного есть для этих целей:
http://cyber.law.harvard.edu/rss/rss.html#hrelementsOfLtitemgt
и велик придумывать никакой не надо, все уже давно придумано:
http://code.google.com/p/as3syndicationlib/

Roma Oskolkov

unread,
Jun 4, 2009, 6:59:54 AM6/4/09
to ruF...@googlegroups.com
Поздно, велик уже изобретен :)

Спасибо всем за помощь большое.

У моего конкретного атом-фида в каждой записи был уникальный айди.
Их я складывал в отдельный простой массив, и с ним уже работал.
Reply all
Reply to author
Forward
0 new messages