Получение данных из XML (E4X)

Как показывает практика, далеко не все знают об использовании оператора «..» и фильтрации при работе с XML. Для этого существуют очень удобные средства E4X (ECMAScript for XML)

Оператор «..»

Данный оператор позволяет получать данные потомков дерева XML вне зависимости от глубины их нахождения.

На примере:
У нас есть категоризованный список продуктов:

<food>
 <vegetables>
   <item caloric="2" isDietic="true">tomato</item>
   <item caloric="40" isDietic="false">potato</item>
 </vegetables>
 <fruits>
   <item caloric="4" isDietic="true">orange</item>
   <item caloric="26" isDietic="false">apple</item>
 </fruits>
</food>

Нам необходимо получить полностью все продукты вне зависимости от их категории:

var foodItems : XMLList = xml..item;
for each (var item : XML in foodItems) {
  trace(item.toString());
}

На выходе получим:

tomato
potato
orange
apple

В сочетании с @ можно получить так же атрибуты:

var foodItems : XMLList = xml..item.@caloric;

Такая запись выдаст абсолютно все атрибуты caloric, вне зависимости от того в каком элементе дерева они находятся

var foodItems : XMLList = xml..@caloric;

Ну и для полной ясности.
Данная запись выдаст только фрукты:

var foodItems : XMLList = xml.fruits..item;

В случае если осталось недопонимание, вы всегда можете ознакомиться с официальной документацией.

Фильтрация данных XML.

Фильтрация позволяет получить только те данные которые необходимы, а не все подряд. Осуществляется она при помощи указания данных в скобках.

Имеется список фильмов, которые мы можем купить в разных интернет магазинах:

<films>
  <item price="99.9">
    <name>Batman and Robbin vs Darkwing Duck</name>
    <shop>ozon.ru</shop>
  </item>
  <item price="110.99">
    <name>Желтый чемоданчик</name>
    <shop>ozon.ru</shop>
  </item>
  <item price="150">
    <name>Валентайн Понтифик. Экранизация.</name>
    <shop>amazon.com</shop>
  </item>
</films>

Нам необходимо получить фильмы которые продаются только в магазине ozon.ru.

var items : XMLList = xml..item.(shop == "ozon.ru");
for each (var item : XML in items) {
  trace(item.toString());
}

На выходе получим:

<item price="99.9">
  <name>Batman &amp; Robbin vs Darkwing Duck</name>
  <shop>ozon.ru</shop>
</item>
<item price="110.99">
  <name>Желтый чемоданчик</name>
  <shop>ozon.ru</shop>
</item>

Фильмы, которые стоят меньше ста рублей:

var items : XMLList = xml..item.(@price < 100);

Фильмы, которые стоят больше ста рублей и продаются только в amazon.com:

var items : XMLList = xml..item.(@price > 100 && shop == "amazon.com");

В случае если осталось недопонимание, вы всегда можете ознакомиться с официальной документацией.

Posted in Flash, Actionscript 3 by Илья Маланьин at Сентябрь 6, 2011.
Tags: , ,

Leave a Reply