E4X란
E4X는 ECMAScript for XML의 약자로서, XML Document Object Model의 대안으로 발전을 하였다. 현재 E4X는 Adobe ActionScript와 FireFox에 의해서 지원을 받고 있다.

E4X의 소개
우선 E4X의 형식을 살펴보자.
  1. var data:XML =  
  2.     <items>  
  3.         <item name="Wii">  
  4.             <source>Amazon</source>  
  5.             <price>364.00</price>  
  6.         </item>  
  7.         <item name="Wii">  
  8.             <source>Target</source>  
  9.             <price>249.99</price>  
  10.         </item>  
  11.         <item name="X-Box 360">  
  12.             <source>Amazon</source>  
  13.             <price>399.99</price>  
  14.         </item>  
  15.         <item name="PlayStation 3">  
  16.             <source>Amazon</source>  
  17.             <price>599.99</price>  
  18.         </item>  
  19.     </items>;

간단히 변수를 XML형식으로 선언하고, 일반적인 XML문서를 작성해주면 된다.
이제는 다른 Looping을 하지 않고도 필요한 정보를 얻기위하여 XML 데이타를 찾는것이 가능하다.
var itemNames:XMLList = data.item.@name;

예제를 보면, XML 데이타에서 item의 Attribute가 name이 정의되어있는 모든 XML리스트를 얻어온다. 여기에서 사용되는 @심볼은 Element와 Attribute를 구별하는데 사용된다.

그러면 Element의 값이 Amazon인 리스트를 얻기 위해서는 어떻게 해야하는가?
var amazonItems:XMLList = data.item.(source == "Amazon");

그냥 간단히 Element를 선택하고 자식Element를 괄호를 사용해서 묶어주고, '=='기호를 사용해서 얻어 오면 되는것이다.

그런데 여기서 재미있는것은 괄호안에다 ActionScript의 Function을 사용할수있다는 것이다. 다음을 보자.

data.item.(trace(@name));

이 경우에는 단지 모든 item Element를 순환하면서 name Attribute의 값을 출력을 한다.

다음으로는 조건이 하나 이상인 경우는 &&나 ||의 기호를 사용해서 조건을 연결할 수도 있다.
var items:XMLList = data.item.(source == "Amazon" && price < 400);

이경우는 item Element의 자식 Element중에서 source가 "Amazon"이고 price가 400이하인 경우를 추출하게 된다.
그런데 만약에 Attribute나 자식Element의 이름을 변수로 받는 경우에는 어떻게 해야하는가 고민이 될것이다. 이 경우에는 단지 attribute()함수와 child()함수를 사용하기만 하면 된다.
  1. var filterBy:String = "name";  
  2. var filterValue:String = "Wii";  
  3. var items:XMLList = data.item.(attribute(filterBy) == filterValue); 

E4X에서 네임스페이스 사용하기
그러면, 이제부터는 XML에 네임스페이스가 포함되어진 경우의 사용법을 알아본다.
E4X에서 네임스페이스를 사용하는데는 2가지 방법이 있는데 첫번째는 쿼리에서 직접네임스페이스를 사용하는 법과 네임스페이스를 전역적으로 선언하는 방법이 있다.

var temp:int = rss.channel.item.yweather::condition.@temp; 
이와 같이 네임스페이에는 "::"을 사용하여 구별한다.

Posted by grandguy
,