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 버터백통
AS3.0 Cookbook/XML2008. 9. 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를 통해 원소나 속성을 추가 할 수 있다.


Posted by 버터백통
AS3.0 Cookbook/XML2008. 9. 20. 16:09

XML은 구조화된 텍스트 기반의 데이터 표시형식이다.
XML은 URL-encoded에 비해 서버사이드 스크립트언어(PHP,Jsp등)에서 만들 때  복잡한 데이터를 쉽게 표현 할 수 있다. 또한 서버사이드 스크립트에서 XML을 읽거나 쓰는 함수를 내장하고 있으며, 모든 종류의 플랫폼과 어플리케이션에서 데이터교환의 표준으로 사용되고 있다.

AS3에서는 XML을 위한 새로운 문법이 추가되었다. 바로 E4X라고 불리는 ECMAScript로서 이전의 DOM(Document Object Model)에 비해 쉽고 다루기 편하게 되어있다.

* XML문서
- XML을 담고있는 파일이며, 이것은 받거나 보내질 XML데이터를 참조하고 있기도 한다.

* XML정의
-  <? xml version="1.0" encode="UTF-8" ?>과 같은 형태로 XML파서는 이 문서가 어떠한 XML문서인지를 판단하는 태그이다.

* XML트리
- 데이터 트리로 XML트리는 계층 구조로 표현한다.

* XML패킷
- 전체 XML문서 중 하나의 노드나 완성된 XML의 조각을 의미한다.

* XML노드
- XML의 기본 단위이다. 노드는 원소(<name></name>) , 텍스트노드 , 특성(attributes)등으로 나누어지며, 일반적으로 원소와 텍스트노드를 "Node"라고 부른다.

* XML원소
- 태그와 같은 형태이며 원소는 시작(<name>)과 종료 태그(</name>)로 구성되거나 내부에 다른 원소를 포함하지 않는다면 단일 태그로 구성한다(<name />) 단이 태그시 끝에 /는 앞에서 한칸 정도 띄워 준다.

* 루트노드
- XML계층구조상 최상위 노드

* 특성(속성)
- 원소태그안에 이름="값"의 형태로 존재한다.(name="홍길동")

<? xml version="1.0" encode="UTF-8" ?>
<rootNode>
<Nodes>
<Person name="홍길동" age="30" />
<Msg>텍스트 노드</Msg>
</Nodes>
</rootNode>
위와 같은 구조로 대부분의 XML데이터는 정의 된다. 인코드 방식은 필요 맞게 사용해야 한다.












Posted by 버터백통