E4X Trick

Вам никогда не требовалось, скажем, пронумеровать все узлы вашего XML определенным атрибутом? Использовать циклы и прочие громоздкие конструкции с рекурсией совершенно неинтересно.

Попробуем средствами E4X. Например, есть у нас вот такой XML и итератор:

This content requires Adobe Flash Player.

Пробуем присвоить все атрибуты:

This content requires Adobe Flash Player.

Получаем ошибку «TypeError: Error #1089: Assignment to lists with more than one item is not supported.». Значит мы не можем присвоить атрибут более чем одному элементу. Пойдем с другой стороны:

This content requires Adobe Flash Player.

Получаем ошибку «TypeError: Error #1010: A term is undefined and has no properties.». Получается, что пока атрибут не будет существовать, мы не сможем присвоить значение.

Хорошо, переделаем XML:

This content requires Adobe Flash Player.

Получаем то, что и требовалось:

This content requires Adobe Flash Player.

Определенно, нас такой подход не устраивает. Что ж, небольшой трюк:

This content requires Adobe Flash Player.

Проблема решена :)

11 Responses to E4X Trick

  1. Хитёр ::)))

  2. Прошу прощения, но все же такая раскраска кода не рулит и вот почему: в RSS, через которые многие читают блоги, вместо кода я вижу лишь следующее:

    This content requires Adobe Flash Player

    То есть в принципе с тем же успехом можно убрать RSS из блога :)

  3. Пытался прикрутить highlight.js, но не получилось.
    Попробую сковырнуть RSS и переделать вывод.

    UPD: Переделал :)

  4. Да. Так лучше :)

  5. Улетненько!

  6. E4X или feed? :D

  7. Типа некропост, я раньше этой записи не видел… :)
    var xml:XML =

    ;

    xml.*.(valueOf().@whatever = Math.random());
    trace(xml.toXMLString());
    А я вообще искал твой пост про компиляцию флешевых векторных объектов силами AS3…

  8. Клева, я, оказывается, такой пост писал :)

  9. А как вместо ++index получить значение из функции, где параетром будет значение, полученное на основе родителя текущего узла?
    В данном примере что должно быть вместо VALUE?
    xml..*.((parent().children()[childIndex()].@index = getAttribute(VALUE)));
    Сам запутался

  10. (parent().children()[childIndex()] можно поменять на valueOf(), как писал выше Олег. А в аттрибут надо сувать parent().

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>