ГлавнаяПо делу › E4X: Сборник кода от учасников конференции [ruFlash]

E4X: Сборник кода от учасников конференции [ruFlash]

December 2nd, 2009

Сборник. E4X на все случаи жизни. Собирается участниками конференции [ruFlash] а так же всеми желающими.

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

Грубо говоря


Не стесняйтесь добавлять свой код. Главное тут не то какой он хитрожопый, а главное тут то, что он работает!
Итак. Для почину мой кусок кода найденный, где то в сети. Что он делает? Да просто с в случайном порядке выбирает узел XML.
var my_xml:XML =
<xml>
<item id="A" />
<item id="B" />
<item id="C" />
<item id="D" />
<item id="E" />
<item id="F" />
<item id="G" />
<item id="H" />
<item id="I" />
<item id="J" />
<item id="K" />
<item id="L" />
<item id="M" />
<item id="N" />
<item id="O" />
<item id="P" />
</xml>;
// можно использовать для перемешивания списков воспроизведения
function getRandomNode(xl:XML):XML {
        // выдергиваем случайный узел, удаляя его из списка. то есть он нам больше не попадется
        var seed:int=Math.random()*xl.*.length();
        var node:XML=xl.*[seed];
        xl.replace(seed, "");
        xl.normalize();
        return node;
}

var the_list:XMLList=XMLList(getRandomNode(my_xml));
while (my_xml.*.length()) {
        // пройдемся по всему списку, пока с него не удалены все узлы
        the_list+=getRandomNode(my_xml);
}
trace(the_list.toXMLString());

Пример от Nox Noctis

// список девочек
var my_xml:XML =
<city name="Kiev">
<district name="Obolon" >
<girl name="Vika" age="22" />
<girl name="Tanya" age="27" />
<girl name="Ira" age="12" />
<girl name="Lena" age="15" />
<girl name="Sveta" age="16" />
<girl name="Olya" age="14" />
</district>
<district name="Lesnoy" >
<girl name="Natasha" age="15" />
<girl name="Kseniya" age="13" />
<girl name="Ulyana" age="45" />
<girl name="Olexandra" age="26" />
</district>
<district name="Borshchagovka" >
<girl name="Inna" age="33" />
<girl name="Alyena" age="23" />
<girl name="Vika" age="34" />
<girl name="Olesya" age="28" />
</district>
<district name="Lukyanovaka" >
<girl name="Marina" age="18" />
<girl name="Valya" age="37" />
<girl name="Yulya" age="28" />
<girl name="Katya" age="20" />
</district>
</city>;

// для того что бы получить список районов где есть малолетки (@age <"18"), используем такую конструкцию.
// решени от Nox Noctis

trace(my_xml.district.(child("girl").(@age <"18").length()));

Пример от foreground

var xml:XML =
<city name="Kiev" >
<district name="Obolon"  id="2" >
<girl name="Vika" count="22" />
<girl name="Tanya" count="27" />
</district>
<district name="Lesnoy" id="2">
<girl name="Natasha" count="15" />
</district>
<district name="Borshchagovka" id="1">
<girl name="Inna" count="33" />
<girl name="Alyena" count="23" />
<girl name="Vika" count="34" />
<girl name="Olesya" count="28" />
</district>
<district name="Lukyanovaka" id="2">
<girl name="Marina" count="18" />
<girl name="Valya" />
<girl name="Yulya"  />
<girl name="Katya" count="20" />
</district>
</city>;

XML.ignoreWhitespace=true;
//Вот пример поиска узла, у которого есть атрибут count и у родителя которого атрибут id равен 2.
trace(xml..*.(hasOwnProperty('@count') && (parent().attribute('id')=='2')));
//На выходе получим.

<girl name="Vika" count="22"/>
<girl name="Tanya" count="27"/>
<girl name="Natasha" count="15"/>
<girl name="Marina" count="18"/>
<girl name="Katya" count="20"/>

Пример от Daniel Polsen

var xml : XML = <data>
<!-- Gruop list -->
<item id="0">
   <param name="group">G01</param>
   <param name="description"><![CDATA[<span class="navigationTab">Вечерние платья</span>]]></param>
</item>
<item id="0">
   <param name="group">G01</param>
   <param name="description"><![CDATA[<span class="navigationTab">Вечерние сумки</span>]]></param>
</item>
<item id="1">
   <param name="group">G02</param>
   <param name="description"><![CDATA[<span class="navigationTab">Джинсы</span>]]></param>
</item>
<item id="2">
   <param name="group">G03</param>
   <param name="description"><![CDATA[<span class="navigationTab">Футболки</span>]]></param>
</item>
</data>;

var list:XMLList=xml.child("item");

trace(list.(child("param").(attribute("name").toString() == "group").valueOf().toString() == "G01").child("param").(attribute("name").toString() == "description").valueOf().toString());
/*
На выходе
<param name="description"><![CDATA[<span class="navigationTab">Вечерние платья</span>]]></param>
<param name="description"><![CDATA[<span class="navigationTab">Вечерние сумки</span>]]></param>
*/

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

Категория: По делу

Смотрите также

SWFObject2 Документация на русском языке.
  1. December 2nd, 2009 at 23:48 | #1

    Я делал подборку по использованию namespace по итогам работы с ним. Вот тут примеры с пояснениями:

    http://lonelyelk.ru/posts/5

    Не знаю, нужно ли перепечатывать.

  2. December 3rd, 2009 at 00:17 | #2

    Хватит и ссылки, но если есть то что можно бы было перепостить, прошу перенести, если оно соответствует формату выше.
    Спасибо.

  3. greendog
    December 3rd, 2009 at 01:57 | #3

    Хорошее дело задумано :)
    Только мне кажется, что всё по теме надо в одно место собрать. Лучше всего в виде стандартной доки. Потому как, со временем такого добра будет много и надо будет его систематизировать. Ссылки собирать не вариант – некоторые со временем сдохнут да и с поиском быстрым ничего не выйдет…

  4. December 3rd, 2009 at 13:05 | #4

    greendog :
    Только мне кажется, что всё по теме надо в одно место собрать. Лучше всего в виде стандартной доки.

    ну вот чем не место? главное собрать, а там уже CHM файл можно скомпилить, брошуры выпустить ;) и так далее.

  5. foreground
    December 3rd, 2009 at 13:38 | #5

    криво запостился.
    И там еще по условию:
    Вот пример поиска узла, у которого есть атрибут count и у родителя которого атрибут id равен 2.

  6. February 12th, 2010 at 09:17 | #6

    интересно как получить количество парентов нода?

  7. February 12th, 2010 at 09:44 | #7

    @SmivaL
    Запросто! Он всегда один.

    Или может надо получить количество узлов таких же как родительский?

  8. February 13th, 2010 at 21:53 | #8

    @Ruslan Shestopal
    1) именно, т.е. имелось в виду родители в глобальном смысле – это все теги в которые он вложен по структуре. к примеру имеем нод глубоко вложенный в структуру, имеющий парент нэйм = item. как получить число всех его парентов с таким же именем?

    2) еще интересно есть ли конструкция, которая показывает “глубину” тэга при запросе. например тут : xml..item глубина у item любая, здесь: xml.*.item – будем условно считать что глубина – 1, здесь xml.*.*.item – 2. возможно ли указать “глубину” вместо звездочек числом вроде такого: xml.[2].item ?

  9. Daniel Polsen
    March 12th, 2010 at 16:02 | #9

    Надо выбрать значение ноды param, у которой атрибут name = “description”, причем у того item’а, у которого значение ноды param с аттрибутом name = “group” равна “G01″

    var xml : XML =

    G01
    <![CDATA[Вечерние платья]]>

    G02
    <![CDATA[Джинсы]]>

    G03
    <![CDATA[Футболки]]>

    ;

    var list : XMLList = xml.child("item");

    trace(list.(child("param").(attribute("name").toString() == "group").valueOf().toString() == "G01").child("param").(attribute("name").toString() == "description").valueOf().toString());

  10. Daniel Polsen
    March 12th, 2010 at 16:03 | #10

    код в комметариях не прошел, лень было писать <

  11. March 14th, 2010 at 15:45 | #11

    Daniel Polsen :код в комметариях не прошел, лень было писать <

    Мды… с этим похоже совсем плохо.
    скинь плиз хмл на мыло, а то что то я не могу пойти тут от обратного и получить ХМЛ.
    ну или escape(xml.toXMLString()) по моему должно прокатить. А я потом уже добавлю к общий спискок.

  12. June 2nd, 2010 at 08:43 | #12

    Полезно вспомнить через полгода *)

  13. June 2nd, 2010 at 10:25 | #13

    @foreground
    И правда пол года прошло. Эх время летит!
    Ну для того и создано что бы было куда подсмотреть. Надо обновить малость эту статью.

  1. Пока нету.