Форум 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=127500)

SunShadow 15.07.2009 15:05

Фильтрация в XML - какая же там область видимости?
 
Здравствуйте уважаемые.
Вопрос чисто теоретический. Допустим у меня стоит задача выбрать узлы для обработки. При этом ранг для фильтра хранится в переменной. Мне пришло в голову а что будет если с таким же именем тег окажется в списке потомков узла. Пробуем.
Код AS3:

id = "6";
xml = <a>
  <b id="7"/>
  <b id="6">
      4
  </b>
  <b id="3">
      тест
      <id>3</id>
  </b>
</a>;

делаем фильтр.
Код AS3:

xml.b.(@id == id);

Попробовал подставить в условие значение переменной как при формировании XML через фигурные скобки
Код AS3:

xml.b.(@id == { id } );

компилятор ругается.
Убираю скобку работает. При чем выбирает два элемента. Например если переменная id == "6" выбирается второй элемент и последний. Это что же выходит, что область видимости перебирает все возможные варианты прежде чем дать ответ?
Как четко добиться однозначности откуда брать данные для сравнения?

Obi 15.07.2009 15:18

Честно говоря вы как-то сумбурно все описали. Немного не понятно что вы надеялись получить.

SunShadow 15.07.2009 15:26

у меня стоит задача удалить из файла xml все тэги имеющие определенный признак со значением указанным в переменной. Вот так первый удаляю например
Код AS3:

id = "32";
delete xml.b.(@id == id)[0];

но у меня нет уверенности что у одного из элементов <b> не окажется вложенных <id>, а это может повлиять на результат работы. Файл грузится извне и может быть всякое.
Я же написал вопрос больше теоретический. Работать будет (с оговорками для тех кто скрипты для формирования xml пишет). Мне любопытно как получить однозначность. Внутри метода this.id написал и получил свойство класса и уверен что никакая локальная переменная id нигде не возникнет. А вот здесь получается так не пропишешь. E4X сам решает что выбирать.

wvxvw 15.07.2009 15:31

Код AS1/AS2:

var id:String = "6";
var xml:XML = <a>
  <b id="7"/>
  <b id="6">
      4
  </b>
  <b id="3">
      тест
      <id>3</id>
  </b>
</a>;
 
trace(xml.b.(@id == this.id).toXMLString());

;)

Если нужно однозначно указать на контекст фильтруемого узла -
Код AS3:

var id:String = "6";
var xml:XML = <a>
  <b id="7"/>
  <b id="6">
      4
  </b>
  <b id="3">
      тест
      <id>3</id>
  </b>
</a>;
 
trace(xml.b.(@id == valueOf().id).toXMLString());


DeliMIter 15.07.2009 15:34

Бывает, как в данном случае, что выполняемый код имеет одновременно несколько контекстов, в которых ищется поле с заданным именем. Указывай контекст, и всё будет хорошо.

Код AS3:

var id:String = "6";
var xml:XML = <a>
  <b id="7"/>
  <b id="6">
      4
  </b>
  <b id="3">
      тест
      <id>3</id>
  </b>
</a>;
 
trace((xml.b.(@id == this.id)).toXMLString());


wvxvw 15.07.2009 15:35

@ DeliMIter:
:p

SunShadow 15.07.2009 15:35

а ежели id есть в классе и локально в методе?)

DeliMIter 15.07.2009 15:36

Дежа вю, ггг.

Добавлено через 1 минуту
Цитата:

Сообщение от SunShadow (Сообщение 835654)
а ежели id есть в классе и локально в методе?)

В этом случае помогает ёмкость с водой, в каковую следует макать головой разработчика.

SunShadow 15.07.2009 15:40

а для указания что это с элементов пишем elements();
Чтож ваша мысля понятна. Ничего когда нибудь и я столько прогеров съем что буду жутко вумный и вы не будете надо мной потешаться

wvxvw 15.07.2009 15:43

Код AS3:

var id:String = "6";
var xml:XML = <a>
  <b id="7"/>
  <b id="6">
      4
  </b>
  <b id="3">
      тест
      <id>3</id>
  </b>
</a>;
function f(xl:XML):void
{
        var id:String = "7";
        trace(xml.b.(@id == id && (id is String)).toXMLString()); // <b id="7"/>
        trace(xml.b.(@id == this.id && (this.id !== id)).toXMLString()); // <b id="6">4</b>
        trace(xml.b.(@id == valueOf().id).toXMLString());
        // <b id="3">
        //          тест
        //          <id>3</id>
        //        </b>
}
f(xml);

Единственная проблема тогда - что делать, если локальная переменная имеет то же значение, что и поле класса... Но вообще - да, в таких случаях, проще отпинать автора кода, чем придумывать извращенные решения...


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

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