[AS3] XML 처리의 새로운 어프로치

Programming/ActionScript 3.0 2007. 6. 16. 16:09
E4X:XML은 ActionScript 3.0 언어의 코어 기능의 베이스가 되고 있다. ActionScript 의 이전의 버젼 (Flash 5 의 ActionScript 1.0 및 그 이후) 에는 XML 데이터를 취급하는 클래스나 메소드가 있었지만 그것들은 ECMAScript 표준에 근거하는 것이 아니었다.

새롭게 설계된 ECMAScript for XML 사양에는 XML 데이터를 처리하기 위한 새로운 클래스군이나 기능이 정의되고 있다. 그것들은 총칭해 E4X로 불리고 있다. ActionScript 3.0은 E4X에 준거한 클래스로 XML , XMLList  ,QName , 및 Namespace 클래스를 갖추고 있다.

E4X 클래스의 메소드, 프롭퍼티, 연산자에 대한 책정 작업에서는 다음의 특징을 실현하는 것이 목표로 여겨졌다.

ActionScript 2.0 에 존재하고 있던 종래의 XML 클래스는 E4X 사양의 일부인 XML 클래스와 경합 하기 위해 ActionScript 3.0 XMLDocument 클래스명으로 변경되었다. XMLDocument ,XMLNode ,XMLParser ,XMLTag 의 각 클래스는 ActionScript 3.0의 XML을 컨트롤 하기 위해 필요한 새로운 클래스는 코어 클래스이므로 사용 시에 패키지를 읽어들 일 필요가 없다.
 
다음은 E4X를 사용한 데이터 처리의 예를 보여준다.

var myXML:XML =
    <order>
        <item id='1'>
            <menuName>burger</menuName>
            <price>3.95</price>
        </item>
        <item id='2'>
            <menuName>fries</menuName>
            <price>1.45</price>
        </item>
    </order>

XML 데이터는 실제의 어플리케이션에서는 Web 서비스나 RSS 피드등의 외부 소스로부터 로드하는 것이 일반적이지만 여기에서는 예를 단순하게 하기 위해서 XML 데이터를 리터럴로 할당했다.

다음의 코드에 나타내는 대로 E4X 에는 XML 의 프롭퍼티나 속성에의 액세스에 사용하는 닷 (.) 이나 속성 식별용의 접두사 (@) 등과 같이 알기 쉬운 연산자가 준비되어 있다.

trace(myXML.item[0].menuName);      // 출력 : burger
trace(myXML.item.(@id==2).menuName); // 출력 : fries
trace(myXML.item.(menuName=="burger").price); // 출력 : 3.95

XML의 노드에 새로운 노드를 할당하려면 다음과 같이 appendChild() 메소드를 사용한다.

var newItem:XML =
    <item id="3">
        <menuName>medium cola</menuName>
        <price>1.25</price>
    </item>

myXML.appendChild(newItem);
@ 및 . 연산자는 독해 뿐만이 아니라 다음과 같이 데이터의 할당에도 사용할 수 있다.

myXML.item[0].menuName="regular burger";
myXML.item[1].menuName="small fries";
myXML.item[2].menuName="medium cola";

myXML.item.(menuName=="regular burger").@quantity = "2";
myXML.item.(menuName=="small fries").@quantity = "2";
myXML.item.(menuName=="medium cola").@quantity = "2";
다음과 같이 for 루프를 사용하면 XML의 일련의 노드에 대한 반복 처리가 생긴다.

var total:Number = 0;
for each (var property:XML in myXML.item) {
var q:int = Number(property.@quantity);
var p:Number = Number(property.price);
var itemTotal:Number = q * p;
total += itemTotal;
trace(q + " " + property.menuName + " $" + itemTotal.toFixed(2))
}
trace ("Total: $", total.toFixed(2));
출력 :
2 regular burger $7.90
2 small fries $2.90
2 medium cola $2.50
Total: $ 13.30


외부 xml 파일을 로드 할 때

url.xml 파일 내용
<?xml version="1.0" encoding="euc-kr" ?>
<rss>
    <item id="1">
        <title>item 1</title>
        <img>img1</img>
        <target>_self</target>
    </item>
    <item id="2">
        <title>item 2</title>
        <img>img2</img>
        <target>_blank</target>
    </item>
    <item id="3">
        <title>item 3</title>
        <img>img3</img>
        <target>_parent</target>
    </item>
</rss>

var request:URLRequest = new URLRequest("url.xml");
var loader:URLLoader = new URLLoader();
loader.load(request);

loader.addEventListener(Event.COMPLETE, xmlLoaded);

function xmlLoaded(event:Event):void {
var myXML:XML = new XML(loader.data);
trace(myXML.item[0].title);
trace(myXML.item.(@id==2).title);
trace(myXML.item.(title == "item 1").title);
}
출력 :
item 1
item 2
item 1


    

설정

트랙백

댓글