AS3.0 Cookbook/XML2008.09.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";


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 정윤수 버터백통
AS3.0 Cookbook/XML2008.09.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세기 북스



신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 정윤수 버터백통
AS3.0 Cookbook/XML2008.09.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);
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 정윤수 버터백통
AS3.0 Cookbook/XML2008.09.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
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 정윤수 버터백통
TAG E4X문법, XML
AS3.0 Cookbook/XML2008.09.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로 설정할 수 있다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 정윤수 버터백통
AS3.0 Cookbook/XML2008.09.20 16:27
[ AS3 메서드를 통한 추가 ]
E4X를 이용하여 원소를 만들고 XML 트리에 추가 하고 싶을 때는 appendChild() ,
prependChild() ,insertChildBefore()나 insertChildAfter() 메서드를 사용한다.

appendChild( 값 ) : 순서에 따른 원소를 추가
prependChild( 값 ) : 제일 앞에 원소를 추가
insertChildBefore( 지정노드  , 값) : 지정 노드 앞에 원소추가
insertChildAfter( 지정노드 , 값 ) : 지정 노드 뒤에 원추가


[ xml테스트 ]
var xml:XML = <Test />;
xml.appendChild( <two>2</two> )
xml.insertChildBefore( xml6.two[0] , <part>1.75</part> );
xml.prependChild( <one>1</one> );
xml.insertChildAfter( xml6.one[0] , 1.5 );
trace(xml);

[ 출력 결과 ]
 <Test>
  <one>1</one>
  1.5
  <part>1.75</part>
  <two>2</two>
</Test>
결과를 보면 루트노드인 <Test>는 AS3의 메서드에 의해 값이 추가되어 끝 태그가 자동으로 생성되었다.
<Test />  -> <Test>추가된 값들...</Test> 또한 추가시 각각의 명령에 맞도록 데이터 결과는 순서대로 정리되어있다.

[ E4X를 통한 원소 추가 ]
노드를 추가하기 위해서는 . 뒤에 노드명을 설정하고 값은 = 를 통해 대입한다.

var xml1:XML = <Test />;
xml1.newElement = "New Insert";
trace(xml1)

[ 결과 ]
 <Test>
  <newElement>New Insert</newElement>
</Test>


대괄호 연산식을 통해 문자와 숫자를 연산하여 노드를 생성하기도 한다. []연산식을 사용하면 "-"이나 "<",">"등과 같은 값을 파싱에러나 컴파일 에러 없이 값을 설정할 수 있다.

[ 변수의 값을 연산하여 설정 ]
var xml2:XML = <Test />;
var id:int = 10;
xml2["user"+id] = "";
trace( xml2 )

[ 결과 ]
 <Test>
  <user10/>
</Test>

[ 파싱 에러를 유발할 특수 문자를 설정 ]
var xml3:XML = <Test />;
xml3["user-id"] = "";
trace( xml3 )

[ 결과 ]
 <Test>
  <user-id/>
</Test>


이처럼 E4X를 통해 원소나 속성을 추가 할 수 있다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 정윤수 버터백통

티스토리 툴바