Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.05.2009, 15:50
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 1  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Question Как удалить элементы XML

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

Старый 20.05.2009, 16:15
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код 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());
__________________
Hell is the possibility of sanity

Старый 20.05.2009, 18:20
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 3  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Красивая конструкция)
Код AS3:
xml.*.(attribute("valid").length() ? true : parent().replace(childIndex(), ""));
xml.normalize();
А можно поподробнее как работает объяснить?
attribute("valid").length() что проверяет? Я так понимаю существование атрибута, hasOwnProperty("@valid") можно использовать, я к нему как то больше привык)?
или истина или заменяем текущий элемент на пустой текстовый.
xml.normalize() получается все лишние текстовые узлы убивает после замены. Правильно понял?
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 21.05.2009, 01:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
hasOwnProperty будет аналогично работать в данном случае, наверняка даже быстрее.
attribute("attributeName") возвращает всегда XMLList, даже если атрибутов с соответстующим именем не было, т.е. нужно проверить не равняется ли длина нулю.
На самом деле вместо true может быть что угодно т.как мы не используем результат фильтра в любом случае, мы просто не можем использовать if() внутри фильтра.
Если условие не выполняется, то мы заменим текущий элемент "" (т.е. фактически удалим), но не совсем, т.как в таком случае будет создан пустой элемент типа текст, но если мы потом normalize()уем етот XML, то пустые текстовые элементы будут удалены.
__________________
Hell is the possibility of sanity

Старый 21.05.2009, 08:02
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Всё уж лучше:

Код AS3:
xml.*.(!hasOwnProperty('@valid') && parent().replace(childIndex(), ''));
Или вообще без normalize:

Код AS3:
xml.setChildren(xml.*.(hasOwnProperty('@valid')));


Последний раз редактировалось etc; 21.05.2009 в 08:06.
Старый 21.05.2009, 08:51
SunShadow вне форума Посмотреть профиль Отправить личное сообщение для SunShadow Найти все сообщения от SunShadow
  № 6  
Ответить с цитированием
SunShadow
 
Аватар для SunShadow

Регистрация: Apr 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 355
Красиво)
Цитата:
Сообщение от __etc Посмотреть сообщение
Код AS3:
xml.*.(!hasOwnProperty('@valid') && parent().replace(childIndex(), ''));
А это еще красивей, исходя из задачи, а не поставленного вопроса)
Цитата:
Сообщение от __etc Посмотреть сообщение
Код AS3:
xml.setChildren(xml.*.(hasOwnProperty('@valid')));
Правда последнее у меня отказалось работать, стал трассироваться оказалось что все работало нормально, просто после по событию второй раз вызывалась эта же функция с другими параметрами и в итоге получал полный список без удаления.
Извиняюсь что украл время, и премного благодарен за опыт. Научился еще немножко работать с xml
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ

Старый 03.03.2011, 07:50
edge1 вне форума Посмотреть профиль Отправить личное сообщение для edge1 Найти все сообщения от edge1
  № 7  
Ответить с цитированием
edge1
 
Аватар для edge1

Регистрация: Apr 2008
Сообщений: 23
А если слегка усложнить задачу? Нужно удалять элементы попарно при определенном содержимом свойства, если такое же содержимое такого же свойства имеется в следующем за ним элементе.

Добавлено через 1 час 2 минуты
У меня получилось так:
Код AS3:
 
xml.*.( parent().children()[ childIndex() + 1 ] && @src == parent().children()[ childIndex() + 1 ].@src && parent().replace( childIndex(), '' ) );
Но удаляется только один элемент из пары.


Последний раз редактировалось edge1; 03.03.2011 в 08:53.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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