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>
*/
Если у вас есть кусок полезного кода, просьба рзместить его в комментриях. Не для себя прошу, токмо волей пославшей мя жены.

Я делал подборку по использованию namespace по итогам работы с ним. Вот тут примеры с пояснениями:
http://lonelyelk.ru/posts/5
Не знаю, нужно ли перепечатывать.
Хватит и ссылки, но если есть то что можно бы было перепостить, прошу перенести, если оно соответствует формату выше.
Спасибо.
Хорошее дело задумано
Только мне кажется, что всё по теме надо в одно место собрать. Лучше всего в виде стандартной доки. Потому как, со временем такого добра будет много и надо будет его систематизировать. Ссылки собирать не вариант – некоторые со временем сдохнут да и с поиском быстрым ничего не выйдет…
ну вот чем не место? главное собрать, а там уже CHM файл можно скомпилить, брошуры выпустить
и так далее.
криво запостился.
И там еще по условию:
Вот пример поиска узла, у которого есть атрибут count и у родителя которого атрибут id равен 2.
интересно как получить количество парентов нода?
@SmivaL
Запросто! Он всегда один.
Или может надо получить количество узлов таких же как родительский?
@Ruslan Shestopal
1) именно, т.е. имелось в виду родители в глобальном смысле – это все теги в которые он вложен по структуре. к примеру имеем нод глубоко вложенный в структуру, имеющий парент нэйм = item. как получить число всех его парентов с таким же именем?
2) еще интересно есть ли конструкция, которая показывает “глубину” тэга при запросе. например тут : xml..item глубина у item любая, здесь: xml.*.item – будем условно считать что глубина – 1, здесь xml.*.*.item – 2. возможно ли указать “глубину” вместо звездочек числом вроде такого: xml.[2].item ?
Надо выбрать значение ноды 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());
код в комметариях не прошел, лень было писать <
Мды… с этим похоже совсем плохо.
скинь плиз хмл на мыло, а то что то я не могу пойти тут от обратного и получить ХМЛ.
ну или escape(xml.toXMLString()) по моему должно прокатить. А я потом уже добавлю к общий спискок.
Полезно вспомнить через полгода *)
@foreground
И правда пол года прошло. Эх время летит!
Ну для того и создано что бы было куда подсмотреть. Надо обновить малость эту статью.