플래시 플레이어는 기본적으로 AMF데이터를 지원하고 있다. 이 AMF라는 것은 오브젝트 인코딩 데이터로서 액션스크립트에서 사용되는 데이터들을 바이트 형태로 저장 / 전송 할 수 있는 방식이다.
가령 액션스크립트의 NetConnection을 사용하여 리모트 콜을 하면 데이터는 자동으로 AMF 형태로 직렬화 하고 사용하는 객체나 클래스에서는 이를 다시 AMF 형태에서 역직렬화 하여 사용한다. 마찬가지로 Shared Object 에 저장을 할때는 자동으로 AMF로 저장되고 Shared Object에서 읽어올 때는 액션스크립트 객체로 역직렬화 한다.

[ AMF 통신 구조 ]
[액션스크립트 객체] <- [AMF] -> [시스템이나 서버 등]


AMF 방식에는 AMF0과 AMF3의 두 종류가 있다.
AMF0은 AVM1과의 호환성을 지원하고 AMF3은 AVM2와 AIR를 지원한다.

보통 런타임 초기에 AMF데이터로 사용할 객체를 registerClassAlias로 매핑해야 한다.
registerClassAlias( "별명" , 실제 클래스 이름 )

이후 런타임시 필요한 데이터를 AMF로 사용할 객체에 데이터를 저장하고 사용하다가 필요할 때 해당 객체를 생성하여 대괄호 연산식([]) 등을 사용하여 꺼내쓴다.

Flex인 경우에는 [RemoteClass(alias="별명") 메타 태그를 AMF로 사용할 객체에 코딩하여 액션스크립트 객체를 매핑하고, 이 후 [Bindable]을 사용하여 등록한 매핑 클래스를 가져와 사용하여야 한다.

Posted by 버터백통

소켓서버를 구현하여 테스트 해보진 못했지만....레퍼런스만 정리해 보면 다음과 같다.

소켓에 연결하고 데이터를 전송하거나 받을때 XMLSocket과 Socket은 약간의 차이점을 갖는다.

[  Socket 연동 ]
Socket에 데이터를 보낼 때 Socket은 flush()를 사용하여 데이터를 최종적으로 보낸다.
Socket()은 데이터를 받을때  ProgressEvent.SOCKET_DATA 을 통해 받는다.

[ XMLSocket연동 ]
XMLSocket에 데이터를 보낼 때 Socket은 send( xml delegator )를 사용하여 데이터를 최종적으로 보낸다.
XMLSocket()은 데이터를 받을 때 DataEvent.DATA이벤트를 통해 데이터를 받는다.

[ Socket에 기록하기 위한 메서드들 ]
writeBoolean(value:Boolean):void

소켓에 부울 값을 씁니다 
   
writeByte(value:int):void
소켓에 바이트를 씁니다.  
   
writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
지정된 바이트 배열로부터 바이트 시퀀스를 씁니다.  
   
writeDouble(value:Number):void
소켓에 IEEE 754 배정밀도 부동 소수점 숫자를 씁니다.  
   
writeFloat(value:Number):void
소켓에 IEEE 754 단정밀도 부동 소수점 숫자를 씁니다.  
   
writeInt(value:int):void
소켓에 부호 있는 32비트 정수를 씁니다.  
   
writeMultiByte(value:String, charSet:String):void  (ex: writeMultiByte('내용' , 'UTF-8')    )
지정된 문자 세트를 사용하여 바이트 스트림에서 멀티바이트 문자열을 씁니다.  
   
writeObject(object:*):void
소켓에 AMF 직렬 형식으로 객체를 씁니다.  
   
writeShort(value:int):void
소켓에 16비트 정수를 씁니다.  
   
writeUnsignedInt(value:uint):void
소켓에 부호 없는 32비트 정수를 씁니다.  
   
writeUTF(value:String):void
소켓에 부호 없는 16비트 정수를 기록합니다.
이것은 지정된 UTF-8 문자열의 바이트 수와 문자열 자체의 길이를 의미합니다.  
   
writeUTFBytes(value:String):void
소켓에 UTF-8 문자열을 씁니다.

[ Socket에 읽기 위한 메서드들 ]
readBoolean():Boolean
소켓에서 부울 값을 읽습니다. 
   
readByte():int
소켓에서 부호 있는 바이트를 읽습니다. 
   
readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
소켓에서 length 매개 변수로 지정된 만큼의 데이터 바이트를 읽습니다.  
   
readDouble():Number
소켓에서 IEEE 754 배정밀도 부동 소수점 숫자를 읽습니다.  
   
readFloat():Number
소켓에서 IEEE 754 단정밀도 부동 소수점 숫자를 읽습니다.  
   
readInt():int
소켓에서 부호 있는 32비트 정수를 읽습니다.  
   
readMultiByte(length:uint, charSet:String):String
지정된 문자 세트를 사용하여 바이트 스트림에서 멀티바이트 문자열을 읽습니다.  
   
readObject():*
소켓에서 AMF 직렬 형식으로 인코딩된 객체를 읽습니다.  
   
readShort():int
소켓에서 부호 있는 16비트 정수를 읽습니다.  
   
readUnsignedByte():uint
소켓에서 부호 없는 바이트를 읽습니다.  
   
readUnsignedInt():uint
소켓에서 부호 없는 32비트 정수를 읽습니다.  
   
readUnsignedShort():uint
소켓에서 부호 없는 16비트 정수를 읽습니다.  
   
readUTF():String
소켓에서 UTF-8 문자열을 읽습니다.  
   
readUTFBytes(length:uint):String
소켓에서 length 매개 변수로 지정된 만큼의 UTF-8 데이터 바이트를 읽고 문자열을 반환합니다.

이처럼 다양한 속성과 메서드를 제공하지만 실제로 스마트폭스 소켓을 사용하면 위의 메서드는 사용할 일 이 거의 없다. 스마트폭스 소켓서버는 세계적으로 인정받는 소켓이기도 하지만 거의 모든 기능이 구현되어있어 로그인이나 채팅시 메세지 전송 등 대부분의 소켓통신을 이용한 메서드가 구현되어있으므로 별도의 학습이 필요하지만 학습을 한 후에는 강력한 기능의 소켓통신 어플리케이션을 만들 수 있을 것이다.
ps) 스마트 폭스 서버
Posted by 버터백통
[ 소켓의 활용 ]
1. 소켓연결은 데이터 전송이 이루어진 다음 자동으로 종료하지 않는다.
2. 클라이언트의 요청이 없더라도 데이터를 Push한다.
3. 주로 멀티유저 어플리케이션에 이용한다.
   
[ 소켓의 종류 ]
1. XMLSocket 
    * 텍스트 기반
    * 실시간 채팅 시스템과 같이 지연 시간이 낮아야 하는 클라이언트 서버 응용 프로그램에 유용
    - XML 메시지는 전이중 TCP/IP 스트림 소켓 연결을 통하여 전송됩니다.
    - 각 XML 메시지는 완전한 XML 문서이며 0바이트로 끝납니다.
    - 단일 XMLSocket 연결에서 송수신할 수 있는 XML 메시지의 수에는 제한이 없습니다.
    
    * XMLSocket.connect() 메서드는 1024 이상의 TCP 포트 번호에만 연결
      ( 1024보다 작은 포트 번호는 주로 FTP, Telnet, HTTP 등과 같은 시스템 서비스에 사용되므로,
         보안 문제 때문에 XMLSocket 객체가 이러한 포트를 사용하지 못하도록 차단 )
    
2. Socket 
    * 바이너리 소켓(메일서버 , 채팅서버 등의 원격제어)
    * ActionScript 코드를 활성화하여 소켓 연결을 만들고 원시 이진 데이터를 읽고 쓸 수 있도록 합니다.
    * XMLSocket과 유사하지만, 수신된 또는 전송된 데이터의 형식을 지정하지는 않습니다. 
    
[  보안정책 ]
    - swf와 호스트는 같은 도메인에 있어야 한다.
    - 네트워크에 있는 swf는 로컬서버에 접근할 수 없다.
    - 허용되지 않은 swf파일은 어떠한 네트워크에도 접근할 수 없다.
    - 크로스 도메인접근을 허가하거나 1024포트이하에 연결하는 경우 크로스도메인 정책이 필요
Posted by 버터백통

파일을 선택/저장하는 다이얼로그 창에서 검색하고자 하는 파일의 형식을 정하여 보고자 한다면 FileFilter() 클래스를 사용한다. FileFilter()는 *.jpg , *.doc등으로 확장자를 필터링하여 검색하게 되므로 파일선택시 매우 편리하며 파일형식을 모르는 유저에게는 다른짓을 못 하도록 막는 차단의 역할을 할 수 있다.

FileFilter()는 배열로 값이 설정되며, description 속성에는 파일 형식에 보여줄 문자열을 설정하고 extension속성에는 필터링할 활장자를 "*.png;*.jpg;*.gif"와 같이 설정하여 FileReference()나 FileReferenceList()에 browse() 메서드에서 배열로 설정한다.
Posted by 버터백통

클라이언트 PC에 있는 파일을 서버에 전송하는 방법은 두가지가 있다. 한개의 파일을 전송하는 것과 다량의 파일을 전송하는 방법이 있다. 한개의 파일을 전송하려면 FileReference()를 사용하고, 다량의 파일을 전송하고 싶으면 FileReferenceList() 클래스를 사용한다. 둘이 틀별한 차이점은 없고 FileReferenceList()는 FileReference()가 배열 형태로 포함되어 있다는 점만 다르다.

서버에 파일을 전송하기 위해 우선 유저는 파일을 검색하는 다이얼로그 창을 열어야 한다. 이는 각각에 browse()라는 메서드로 정의 되어있다. browse()가 호출되면 파일을 선택하는 다이얼로그 창이 팝업되고FileReference()는 파일이 한개만 선택되고 FileReferenceList()는 여러개의 파일을 선택할 수 있다. 물론 선택이 끝나면 Event.SELECT가 발생한다. 거의 브라우저에서 자동 차단되지만 다이얼로그창이 활성화 된상태에서 또 팝업하려고 시도 한다면 IllegalOperationError이라는 에러가 발생한다. 따라서 browse() 호출시 try catch로 에러를 방지해야 한다.

파일 선택 후 부터 FileReference()와 FileReferenceList()는 약간의 처리방식이 다르다.
FileReference()의 경우 파일이 한개 이므로 바로 upload()를 실행하면 된다.
하지만 FileReferenceList()는 FileReferenceList.fileList 안에 배열로 설정되어 있으므로 FileReferenceList.fileList의 길이 만큼 반복하면서 각각의 원소에 upload()를 실행해야 한다.

이러한 FileReference()와 FileReferenceList()에 의해서 불러온 사용자 파일의  BytesArray에 직접 접근못하는 것이 좀 아쉽지만 파일정보를 전혀 못 읽어오는 것은 아니다.

파일 레퍼런스에 불려진 파일의 정보를 읽는 파일레퍼런스의 속성은 다음과 같다.
creationDate : Date
로컬 디스크의 파일을 만든 날짜입니다. 
   
creator : String
파일의 Macintosh 작성자 유형입니다. 

modificationDate : Date
로컬 디스크 파일의 가장 최근 수정 날짜입니다.  
   
name : String
로컬 디스크에 있는 파일의 이름입니다.  
      
size : uint
로컬 디스크에 있는 파일의 크기(바이트)입니다. 
   
type : String
파일 유형입니다. 
Posted by 버터백통
사용자의 호출에 의해 서버에서 전송하는 파일을 저장 다이얼로그에 의해 위치와 이름을 확인하고 저장 하고 싶을 때는 FileReference()download()메서드를 사용한다.

FileReference() 객체는 파일을 저장하거나 서버에 저장할 때  그림과 같이 사용자가 다이얼로그창을 이용하여
클라이언트에 저장 또는 서버에 업로드 등을 지원하는 클래스이다.


FileReference를 사용하여 URLRequest로 접근할 때는 HTTP또는 HTTPS일때만 접근이 가능하다.
서버쪽에서 보안에 개념이 있다면 보통은 HTTPS를 선호하게 될 것이지만 우리는 크게 신경쓰지 않아도 된다. HTTP나 HTTPS는 AS3에서는 사용법이 별차이점이 없기 때문이다.

다이얼로그 창에서 사용자의 선택에따른 이벤트는 Event.SELECTEvent.CANCEL가 발생한다 각각의 역할에 맞는 함수를 구현해 두면 되고 저장시 진행사항을 보도 싶으면 ProgressEvent.PROGRESS를 추가로 더 등록하면 된다.
Posted by 버터백통
HTML에서 간간히 SWF파일에 변수를 설정해 주어야 하는경우가 자주 발생한다. user id라던가 기본 유저정보는 HTML에서 설정하여 초기에 SWF에 보내지게 되는데 HTML에 파라미터 "FlashVars"라는 곳을 찾아 보내고자
하는 변수명과 값을 URL-encoded방식으로 설정하면 된다.
과거 SWF에서 이 값이 저장 되는 곳은 _root였다 AS3환경에서는 root.loaderInfo.parameters에 저장되므로
root.loaderInfo.parameters으로 접근하여 값을 꺼내서 사용하면 된다.

컴파일시에 HTML에서는 IE체크를 하여 두가지로 플래시 파라미터를 설정하는데 양쪽 모두 선언해 주던가 공통 실행부를 찾아  FlashVars를 설정하면 된다.
Posted by 버터백통

앞서 동기식으로 자바스크립트 함수를 호출하는 ExternalInterface를 이용하여 함수를 호출하였는데 문제는 동기식이라는 것이다. ExternalInterface() 보다는 함수 연동이 약하기는 하지만 비동기식으로 자바스크립트를 호출하거나 url경로를 호출하는 navigateToURL()라는 것이 있다.

navigateToURL( URLRequest , window )으로 URLRequest와 같이 사용하며,
 window의 값은 우리가 자주 사용하는 윈도우 이름(경로)을 설정한다.
_self : 현재 윈도우의 현재 프레임을 지정합니다.
_blank : 새 윈도우를 지정합니다.
_parent : 현재 프레임의 부모를 지정합니다.
_top : 현재 윈도우의 최상위 프레임을 지정합니다.


Posted by 버터백통
AS3는  HTML에 설정되거나 로드된 자바스크립트를 호출 할 수 있으며 또한 HTML의 자바스크립트는 SWF에 설정된 AS3의 함수를 호출할 수 있다.

이 각각은 ExternalInterface를 통하여 연결되는데 ExternalInterface객체는 동기식 호출이 되므로 무거운 실행문은 html의 다른 함수에서 처리하게 하고  SWF에서 바라보는 자바스크립트 함수는 실행 처리가 가볍게 만들어 주도록 해야 한다.

SWF에서 자바스크립트 호출
ExternalInterface.call( "호출할 함수명" , 파라미터 값 );
HTML에 포함된 자바스크립트 함수는 ExternalInterface.call()을 사용하여 호출한다.

자바스크립트에서 SWF함수 호출
ExternalInterface.addCallback( "호출할 함수명" , 처리함수 );
자바스크립트에서 호출할 SWF 객체의 ID뒤에 호출할 함수명을 실행하면 SWF내부에 addCallback()으로 설정된 처리함수가 실행한다.






Posted by 버터백통

서버와 클라이언트간 통신 방법 중에 웹서비스와 리모트 객체가 있다. 이들은 복잡한 데이터를 간단하게 전달하거나 클라이언트가 서버의 메서드를 쉽게 비동기 요청을 할 수 있도록 한다.

[ 웹서비스를 이용한 호출 ]
웹서비스 객체는 플렉스 컴포넌트인 WebService를 이용하여 객체의 메서드를 호출 할 수 있다. 모든 웹서비스는 WSDL(Web Service Description Language : 웹 서비스 기술 언어)을 가지고 있다.
WebService객체의 wsdl 속성을 사용하여 WebService객체에 WSDL의 경로를 설정한다.
WebService.wsdl = "WSDL을 명시한 서버사이드 스크립트 경로";

그리고 명시된 WSDL의 데이터를 loadWSDL()메서드를 통해 호출한다.
호출에 성공하면 LoadEvent이벤트의 "LOAD"가 발생하고 실패하면 FaultEvent이벤트의 "FAULT"
실행한다.

WebService객체에 위임된 변수는 이제 웹서비스의 메서드를 호출 할 수 있게 된다. 가령 서버의 WSDL에 평균값을 구하여 리턴하는 메서드가 있으면 아래와 같이 호출하면 된다.
WebService.getAverages();
그리고 서버에서 실행된 결과를 받기 위해서는 ResultEvent이벤트를 사용한다.
WebService.getAverages.addEventListener( ResultEvent.RESULT , onGetAverages );
onGetAverages() 함수에는 리턴된 값을 처리하는 명령문을 사용하면 된다.



[ 플래시 리모트객체를 이용한 호출 ]
리모트 객체는 NetConnection()를 사용하여 서비스의 메서드등의 정보등을 관리하는 서버사이드에 connect()를 하여 길을 연다.
NetConnection.connect( "AMF 플래시 리모팅 게이트 웨이 경로" )

연결된 NetConnection의 위임 객체는 서버의 메서드를 call() 메서드를 이용하여 호출하며 응답객체 Responder()를 만들어 호출시 등록한다. 

Responder( 결과함수 , 상태함수 )는 성공하여 결과를 리턴 할때나 에러,실패등의 상태를 실행할 함수를
설정한다.
var res:Responder = new Responder( onResult , onError );
NetConnection.call("호출할 메서드",  res);
마찬가지로 호출한 메서드에 대한 결과를 서버에서 받으면 처리함수(onResult )에서 처리하면 된다. 각 함수의 파라미터는 Object를 받는다.

Posted by 버터백통
AS3.0 Cookbook/비디오2008. 9. 20. 19:28

비디오 객체는 사용자 PC의 카메라에서 퐐영된 정보를 받을 수 있다. 서버에서 전송되는 영상의 데이터를 attachNetStream()를 이용하여 읽는다면 PC카메라의 영상은 attachCamera()를 사용하여 전송되는 영상을 읽어 화면에 보여주게 된다. 따라서 attachCamera()에  Camera의 Delegator를 설정하면 된다.

Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 18:58

XML에 html문법이나 자바스크립트를 설정하고 싶으면 <![CDATA[[코드]]> 노드를 사용한다.
<![CDATA[코드]]>노드는 XML 파서에 의해 해석하지 말고 그대로 브라우저에 출력하라는 명령문으로 html의 링크나 자바스크립트 명령문을 설정하여 이를 호출하여 사용할 수 있다.

var data2:XML =  
<test>
          <![CDATA[<a href="htttp://www.daum.net">다음</a>]]>
            </test>

var data3:XML =  
<test>
          <![CDATA[<a href="javascript:alert('test')">얼랏</a>]]>
         </test >

또는 자바스크립트인 경우 직접 함수를 선언할 수 있다.
var alert:XML =  
<alert>
       <![CDATA[
        function alertFunc(str)
        {
            alert(str);
        }
       ]]>
</alert>











Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 18:49

XML데이터의 노드를 찾기 위해서는 Xpath나 서술필터링을 사용하여 노드 데이터로 접근한다.
Xpath는 계층구조의 트리형태로 접근하여 노드나 값을 접근하고 서술 필터링은 조건식을 사용하여 노드나 값에 접근한다.

var data1:XML =  <foods>
          <fruits>
           <fruit color="red">
            <name>Apple</name>
           </fruit>
           <fruit color="orange">
            <name>Orange</name>
           </fruit>
           <fruit color="green">
            <name>WaterMelone</name>
           </fruit>
           <servings>3</servings>
          </fruits>
          <vegetables>
           <vegetable color="red">
            <name>토마토</name>
           </vegetable>
           <vegetable color="brown">
            <name>감자</name>
           </vegetable>
           <vegetable color="green">
            <name>양파</name>
           </vegetable>
           <servings>2</servings>
           <vegetable color="green">
            <name>멜론</name>
           </vegetable>
           <servings>2</servings>
          </vegetables>
         </foods>;

[ Xpath방식  ]
- 계층(트리)구조식로 데이터 접근

var fruitsList:XMLList    = data1.fruits.fruit;
trace("******** fruitsList ******** \n " , fruitsList )

<fruit color="red">
  <name>Apple</name>
</fruit>
<fruit color="orange">
  <name>Orange</name>
</fruit>
<fruit color="green">
  <name>WaterMelone</name>
</fruit>

var apple:XML      = data1.fruits.fruit[0];
trace("******** apple ******** \n " , apple )

<fruit color="red">
  <name>Apple</name>
</fruit>


var vegetableList:XMLList   = data1..vegetable;
trace("******** vegetableList ******** \n " , vegetableList )

<vegetable color="red">
  <name>토마토</name>
</vegetable>
<vegetable color="brown">
  <name>감자</name>
</vegetable>
<vegetable color="green">
  <name>양파</name>
</vegetable>
<vegetable color="green">
  <name>멜론</name>
</vegetable>


var servings:XMLList    = data1.*.servings;
trace("******** servings ******** \n " , servings )

<servings>3</servings>
<servings>2</servings>
<servings>2</servings>

var color:XMLList     = data1.fruits.fruit.@color;
trace("******** color ******** \n " , color )

redorangegreen

[ 서술 필터링 ]
- 서술필터링은 조건형식으로 사용, 조건에 맞는 속성/노드를 선택 


trace("******** fruit red color ******** \n " , data1..fruit.(@color == "red") ); 
<fruit color="red">
  <name>Apple</name>
</fruit>

trace("******** vegetable green color ******** \n " , data1..vegetable.(@color == "green") ); 
<vegetable color="green">
  <name>양파</name>
</vegetable>
<vegetable color="green">
  <name>멜론</name>
</vegetable>

trace("******** 사과의 컬러 속성 ******** \n " , data1..fruit.(name=="Apple").@color) 
red


* 첫문자 모음 출력
trace("******** 모음 출력 ******** \n " , data1..fruit.(/^[aeiouAEIOU].*/.test(name) ) ) 
<fruit color="red">
  <name>Apple</name>
</fruit>
<fruit color="orange">
  <name>Orange</name>
</fruit>
Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 18:23
AS3에서 XML의 노드나 특성을 제거하기 위해서는 delete 키워드를 사용한다.
delete는 메서드가 아니므로 어떠한 객체 뒤에서 사용하거나 호출하는 것이 아니고 명령문 제일 앞에서 사용한다.

var books:XML =  <books> 
          <item price="12000" author="이외수" publisher="일지문화">삶의 길</item>
          <item price="28000" author="정윤수" publisher="제우미디어">플래시 (모션+액션)</item>
          <opinion>
              <item price="26000" author="이문열" publisher="샘터">그의 아버지</item>
              <item price="28000" author="전미연" publisher="밝은세상">사랑하기 때문에</item>
              <poem>
                 <item price="6500" author="정윤수" publisher="21세기 북스">시간</item>
                 <item price="12500" author="정윤수" publisher="21세기 북스">깜빡임</item>
              </poem>
           </opinion>
         </books>;


* books의 root노드 안에 item노드의 price속성을 제거 
delete books.item.@price;

* opinion의 poem노드 전체를 제거
delete books.opinion.poem;

* opinion의 노드의 모든 텍스트 노드를 제거
delete books.opinion.item.text()[1];

Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 18:10

서버사이드에 XML데이터를 업로드 하기 위해서는 URLLoader()를 사용하고 URLRequest()객체에 데이터를 보내고자 하는 xml데이터로 설정하고 데이터의 Mime타입을  "text/xml"로 설정하면 된다.

var xmlData:XML =   <gamescore>
          <username>{userName}</username>
          <score>{score}</score>
         </gamescore>;

[ URLRequest의 데이터와 컨텐츠 mime 타입설정 ]
URLRequest.data = xmlData;
URLRequest.contentType = "text/xml";


Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 17:59

XML에는 원소,  즉 노드 말고도 노드에 포함된 속성(특성)이 있다. 이 값을 읽어 오기 위해서는 AS3에서 제공하는 attributes()를 사용하여 값을 읽어오거나 E4X문법을 사용하여 읽어 올 수 있다.
또한 AS3에서 name()를 사용하여 속성의 이름을 알 수 도있다.

var books:XML =  <books> 
          <item price="12000" author="이외수" publisher="일지문화">삶의 길</item>
          <item price="28000" author="정윤수" publisher="제우미디어">플래시 (모션+액션)</item>
           <opinion>
            <item price="26000" author="이문열" publisher="샘터">그의 아버지</item>
            <item price="28000" author="전미연" publisher="밝은세상">사랑하기 때문에</item>
            <poem>
             <item price="6500" author="정윤수" publisher="21세기 북스">시간</item>
            </poem>
           </opinion>
         </books>;


[ AS3.0의 메서드 활용 ]
1. attributes() 메서드는 속성이 있는 한 개의 노드에만 적용해야 한다. ( books..attributes() ) -> 에러발생
2. attributes()를 사용하면 XMLList로 반환한다.
3. XMLList는 배열과 같아서 정수색인으로 값을 검색한다. 


var atr:XMLList = books.item[0].attributes();
trace( atr[0] );       // 12000
trace( atr[1] );       // 이외수

   
* name() 메서드는 속성의 이름을 반환하여 준다.
trace( books.item[0].attributes()[0].name() )     // price
trace( books.item[0].attributes()[1].name() )     // author
   
* attribute() 메서드는 속성의 값을 반환한다.
trace( books.item[1].attribute("author") );          // 정윤수

* 해당 노드에 대한 모든 속성 체크
for each( var atrb:XML in books.item[1].attributes() ){
    trace( "for each : " , atrb.name() , " = " , atrb.toString()  )
   }
[ 출력 결과 ]
for each :  price  =  28000
for each :  author  =  정윤수
for each :  publisher  =  제우미디어

[ E4X문법 활용 ]
trace( books.opinion.item[0].@author )           // 이문열
trace( books..@author )                                // 이외수정윤수이문열전미연정윤수
trace( books..@price )                                  // 120002800026000280006500

   
* 가격의 합을 구한다.
var total:Number = 0;
for each( var atrb:XML in books..@price ){
    total += Number( atrb );
}
trace("가격의 합 : " , total );                         // 가격의 합 :  100500
   
* @연산자와 대괄호 연산자를 이용
trace( books..@["author"] )                         // 이외수정윤수이문열전미연정윤수
trace( books..@["publisher"] )                     // 일지문화제우미디어샘터밝은세상21세기 북스



Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 17:43

XML문서에 포함된 데이터를 AS3의 데이터 타입으로 변환시킨다.
var xml2:XML = <Test>
         <bool>false</bool>
         <int>20</int>
         <number>0.5</number>
        </Test>
var bool:Boolean = Boolean( xml2.bool )
var int:int = int( xml2.int ) + 10
var number:Number =  Number( xml2.number ) + 1;


특별히 문자나 숫자는 String() , Number() , int()등을 사용하여 캐스팅하면 되지만
Boolean같은 경우 조건문을 사용하여 부울값을 리턴 받아 대입하여야 한다. 또한 XML의 데이터가 True 또는 TRUE등으로 대소문자가 섞였을 경우를 대비하여 toLowerCase() 메서드를 이용하여 모두 소문자로 체크한다.

* 값을 체크하면 true로 설정되어있다. 따라서 정상적으로 Boolean으로 사용할 수 없다.
if(bool) trace("비정상 체크 true : " , bool);
else trace("비정상 체크 false : " , bool);
    
* XML데이터는 문자열이므로 아래처럼 정상적으로 Boolean값으로 성정한다.
bool =  String( xml2.bool ).toLowerCase() == "true";
if(bool) trace("정상 체크 true : " , bool);
else trace("정상 체크 false : " , bool);
Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 17:32
E4X를 통해 XML 객체를 Object 객체처럼 사용할 수 있으며 접근 할 수 있다.
또한 .. 을 통해 중간의 노드 이름을 생략할 수 있다.

var xml:XML =
        <Test>
         <menu>
          <item>
           <name>Apple</name>
           <color>Red</color>
          </item>
         </menu>
         <menu>
          <item>
           <name>Orange</name>
           <color>Yellow</color>
          </item>
         </menu>
        </Test>;

   
* 노드를 찾기할때 root node는 생략한다.  
trace( xml.menu )     
 <menu>
  <item>
    <name>Apple</name>
    <color>Red</color>
  </item>
</menu>
<menu>
  <item>
    <name>Orange</name>
    <color>Yellow</color>
  </item>
</menu>


trace("**************** \n" , xml.menu.item )
<item>
  <name>Apple</name>
  <color>Red</color>
</item>
<item>
  <name>Orange</name>
  <color>Yellow</color>
</item>

trace("**************** \n" , xml.menu.item.name )
 <name>Apple</name>
<name>Orange</name>

* .. 중간노드를 생략하고 찾는 노드명을 서브에서 찾아준다.  
trace("**************** \n" , xml..name )
 <name>Apple</name>
<name>Orange</name>

trace("**************** \n" , xml.menu[0].item )
 <item>
  <name>Apple</name>
  <color>Red</color>
</item>

trace("**************** \n" , xml.menu[1].item )  
 <item>
  <name>Orange</name>
  <color>Yellow</color>
</item>

trace("**************** \n" , xml.menu[0]..color )
Red

trace("**************** \n" , xml.menu[1]..color
Yellow
Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 17:16

E4X 언어 확장의 일부로 도입된 for each..in 문은 XML 객체뿐만 아니라 Object 및 Array에 대해서도 사용할 수 있습니다.

 1) for each..in 문은 객체의 속성 중 고정된 속성은 제외하고 동적 속성만 반복합니다. 
 2) 고정된 속성은 클래스 정의의 일부로 정의된 속성입니다.

for each..in 문을 사용자 정의 클래스의 인스턴스와 함께 사용하려면 dynamic 속성을 사용하여 클래스를 선언해야 합니다.

* for..in 문과는 달리 for each..in 문은 속성 이름 대신 객체의 속성 값을 반복합니다.
   - for in : 객체의 속성 이름을 반환
   - for each in : 객체의 속성 값을 반환

var menu:XML =  <menu>
<menuItem label="File" size="100kb">
<menuItem label="New" size="200kb" />
</menuItem>
<menuItem label="Help" size="300kb">
<menuItem label="About" size="400kb" />
</menuItem>
this is Text Node
</menu>;

for each ( var element:XML in menu.elements() )
{
    trace(
element.@label );
    trace(
element.@size );
}

[ 출력 결과 ]
File
100kb
Help
300kb
walk label :  File
walk size :  100kb
walk label :  New
walk size :  200kb
walk label :  Help
walk size :  300kb
walk label :  About
walk size :  400kb


* elements() 메서드는 XML의 모든 자식노드를 XMLList로 반환한다.

Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 16:30
특성을 추가하기 위해서는 E4X 문법을 사용한다. 노드(원소)에 . 을 이용하여 접근한 다음 @(속성접근)를 사용하여 값을 대입하게 된다.

var xml1:XML = <Test><someElement /></Test>;
xml1.someElement.@number = 120;
xml1.someElement.@string = "some Text";
xml1.someElement.@boolean = true
xml1.someElement.@ary = ["a" , undefined , "b" , "c" , null , 100 , false];
xml1.someElement.@[ "bad-var-name" ] = "yes";
xml1.someElement.@[ "color" + num ] = "red";
trace(xml1);

<Test>
  <someElement number="120" string="some Text" boolean="true" ary="a,,b,c,,100,false"
                      bad-var-name="yes" color10="red"
/>
</Test>
이처럼 다양항 데이터 타입을 XML로 설정할 수 있다.
Posted by 버터백통