scaleform.minarto.com

[강좌] AS3.0 의 XML 을 이용한 작업 본문

ActionScript

[강좌] AS3.0 의 XML 을 이용한 작업

미나토 2008. 1. 17. 14:14



이전글과 같이 회사 교육 자료로 만드는 중
카테고리를 따로 만들기는 좀 머하고...


////////////////////////////////


XML 을 이용한 작업 방법

AS 1.0 의 Flash Player 5 버전에서 XML 과 LoadVars 클래스가 생겨나기 이전에는 외부에서 문서를 가져와 작업하기는 어려웠습니다.
결국 플래시 내부에 데이터들을 집어넣고 돌려야 한다는 얘기인데 예를 들어 어느정도 규모가 있는 홈페이지의 메뉴같은 경우는 수정사항이 많은 편입니다

메뉴가 생겼다가 사라지고 그대로더라도 링크가 바뀌는 등의...


기존에는 이럴 때마다 플래시 파일을 고쳐야 하는 매우 큰 불편함이 있었다는 이야기입니다. 플래시 개발자가 아닌 관리자들은 직접 수정할 수도 없었고요.


xml을 가져와 사용할 수 있게 되면서 이 방식은 바뀌게 되었습니다.

2.0 의 코드를 보겠습니다


예를 들어 다음과 같은 메뉴 xml을 만들어 놓는다면

<menu>
    <main name="메인" link="/index.html" />
    <main name="회사소개" link="/about.html">
        <sub name="연혁" link="/about/history.html" />
        <sub name="오시는 길" link="/about/map.html" />
    </main>
    <main name="공지사항" link="/notice.html />
</menu>


import mx.utils.Delegate;
import mx.xpath.XPathAPI;

var menu_array:Array;

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = Delegate.create(this, xmlOnLoad);
function xmlOnLoad(success:Boolean):Void
{
    if(success)
    {
        menu_array = [];
        
        var tmp_array:Array = XPathAPI.selectNodeList(xml.firstChild, "/menu/main");
        var cnt:Number = tmp_array.length;
        for(var i:Number=0; i<cnt; i++)
        {
            var main_node:XMLNode = tmp_array[i];
            var main_array:Array = [];
                
            var name:String = dataNode.attributes.name;
            var link:String = dataNode.attributes.link;
            
            main_array.name = name;
            main_array.link = link;

            var stmp_array:Array = XPathAPI.selectNodeList(main_node.firstChild, "/sub");
            var subCnt:Number = stmp_array.length;
            for(var j:Number=0; j<subCnt; j++)
            {
                var sub_node:XMLNode = stmp_array[i];
                var sub_array:Array = [];
                    
                var name:String = sub_node.attributes.name;
                var link:String = sub_node.attributes.link;
                
                sub_array.name = name;
                sub_array.link = link;

                main_array.push(sub_array);
            }

            menu_array.push(main_array);
        }
    }
}
xml.load("data.xml");



뭐, 이런식으로 배열로 변환할 수 있었습니다.





이제 AS 3.0 으로 변환해보면

package
{
    import flash.display.Sprite;
    import flash.net.*;

    public class Main extends Sprite
    {
        public function Main()
        {
            var uloader:URLLoader = new URLLoader();    // 외부 문서를 불러오는데 사용하는 클래스
            uloader.addEventListener(Event.COMPLETE, complete);    // 문서가 다 불러와지면 complete 핸들러를 실행한다
            uloader.load(new URLRequest("data.xml"));    // 스트링이 아닌 URLRequest 객체로 던져서 불러와야 한다
        }

        protected var menu_array:Array    // 메뉴 배열
        protected function complete(e:Event):void
        {
            menu_array = [];
            var xml:XML = XML(e.target.data);    // 불러온 것은 텍스트의 형태이므로 XML로 만들어준다

            var cnt:uint = xml.menu.main.length();    // E4X 를 사용하여 배열로 변환
            for(var i:uint=0; i<cnt; i++)
            {
                var main_xml:XML = xml.menu.main[i];
                var main_array:Array = [];

                var name:String = main_xml.@name;
                var link:String = main_xml.@link;

                main_array.name = name;
                main_array.link = link;

                var subCnt:uint = main_xml.sub.length();
                for(var j:uint=0; j<subCnt; j++)
                {
                    var sub_xml:XML = main_xml.sub[j];
                    var sub_array:Array = [];

                    var name:String = sub_xml.@name;
                    var link:String = sub_xml.@link;

                    sub_array.name = name;
                    sub_array.link = link;

                    main_array.push(sub_array);
                }

                menu_array.push(main_array);
            }
        }
    }
}