Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как удалить элементы XML (http://www.flasher.ru/forum/showthread.php?t=125280)

SunShadow 20.05.2009 15:50

Как удалить элементы XML
 
Здравствуйте уважаемые.
Задача в общем то простая, но почему то не могу осилить.
Есть XML состоящий из корневого элемента и списка вложенных. Задача проверить все вложенные элементы и те у которых отсутствует определенный атрибут удалить из XML.
в цикле прохожу по элементам
delete xml.*[i];
где xml сам документ, i индекс удаляемого элемента который выбирается в обратном порядке чтобы не было глюков после удаления. Строка исполняется но при этом в самом xml как были все элементы так и остаются. Я так понимаю что xml.* возвращает XMLList и удаление уже идет из его списка, а как мне удалить из самого xml?:wacko:

wvxvw 20.05.2009 16:15

Код AS3:

var xml:XML =
<foo>
        <bar valid="1"/>
        <bar valid="1"/>
        <bar valid="1"/>
        <bar/>
        <bar valid="1"/>
        <bar/>
        <bar valid="1"/>
</foo>;
 
xml.*.(attribute("valid").length() ? true : parent().replace(childIndex(), ""));
xml.normalize();
trace(xml.toXMLString());


SunShadow 20.05.2009 18:20

Красивая конструкция)
Код AS3:

xml.*.(attribute("valid").length() ? true : parent().replace(childIndex(), ""));
xml.normalize();

А можно поподробнее как работает объяснить?
attribute("valid").length() что проверяет? Я так понимаю существование атрибута, hasOwnProperty("@valid") можно использовать, я к нему как то больше привык)?
или истина или заменяем текущий элемент на пустой текстовый.
xml.normalize() получается все лишние текстовые узлы убивает после замены. Правильно понял?

wvxvw 21.05.2009 01:21

hasOwnProperty будет аналогично работать в данном случае, наверняка даже быстрее.
attribute("attributeName") возвращает всегда XMLList, даже если атрибутов с соответстующим именем не было, т.е. нужно проверить не равняется ли длина нулю.
На самом деле вместо true может быть что угодно т.как мы не используем результат фильтра в любом случае, мы просто не можем использовать if() внутри фильтра.
Если условие не выполняется, то мы заменим текущий элемент "" (т.е. фактически удалим), но не совсем, т.как в таком случае будет создан пустой элемент типа текст, но если мы потом normalize()уем етот XML, то пустые текстовые элементы будут удалены.

etc 21.05.2009 08:02

Всё уж лучше:

Код AS3:

xml.*.(!hasOwnProperty('@valid') && parent().replace(childIndex(), ''));

Или вообще без normalize:

Код AS3:

xml.setChildren(xml.*.(hasOwnProperty('@valid')));


SunShadow 21.05.2009 08:51

Красиво)
Цитата:

Сообщение от __etc (Сообщение 821739)
Код AS3:

xml.*.(!hasOwnProperty('@valid') && parent().replace(childIndex(), ''));


А это еще красивей, исходя из задачи, а не поставленного вопроса)
Цитата:

Сообщение от __etc (Сообщение 821739)
Код AS3:

xml.setChildren(xml.*.(hasOwnProperty('@valid')));


Правда последнее у меня отказалось работать, стал трассироваться оказалось что все работало нормально, просто после по событию второй раз вызывалась эта же функция с другими параметрами и в итоге получал полный список без удаления.
Извиняюсь что украл время, и премного благодарен за опыт. Научился еще немножко работать с xml

edge1 03.03.2011 07:50

А если слегка усложнить задачу? Нужно удалять элементы попарно при определенном содержимом свойства, если такое же содержимое такого же свойства имеется в следующем за ним элементе.

Добавлено через 1 час 2 минуты
У меня получилось так:
Код AS3:

 
xml.*.( parent().children()[ childIndex() + 1 ] && @src == parent().children()[ childIndex() + 1 ].@src && parent().replace( childIndex(), '' ) );

Но удаляется только один элемент из пары.


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

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