Saladin’s Blog

AS3 XML처리모델

Posted on: 12월 26, 2007

음. 일단 AS3의 xml 모델을 접해본 결과 첫느낌은 이렇다: 

1. xml파싱이 대단히 간편하고 효율적이게 변했다.

 -> 굳이 xPath API를 안써도 됨. childNode같은 특정 메쏘드나 에트리뷰트로 접근했던 것이 노드의 localName과 ‘.’연산자로 바로 접근가능하고, 심지어는 path를 다 쓰기 귀찮으면 xml객체 뒤에 ‘..’연산자를 쓰고 원하는 노드의 locaName을 적으면 아예 검색도 해주면서 자동참조까지 해준다. 거기다 표현식에 직접조건문을 삽입할 수 있으므로 코드 줄수도 줄어들게된다. 

2. E4X를 지원한다. 다른 언어(Java,Javascript,C#등)와 스펙이 완벽호환된다. 첨부파일로 ECMAscript for XML의 상세한 사양서를 넣어둔다.

3. 그런데 nameSpace쪽이 좀 직관적이 못하고, 경직되고, 답답한 느낌이 있다. 예를 들어 2.0에서는 네임스페이스가 있더라도 무시하고 xPathAPI를 써서 localName으로 바로 접근하면 값이 튀어나왔지만 3.0에서는 참조 할때마다 prefix를 명시해야한다.

 예를 들면 이런 namespace xml문서가 있다고 치면

 <a xmlns=http://vdesire.com/wpf/2.0” xmlns:soap=”블라블라”>

     <soap: b>

          <xx:b1/>

          <xx:b1/>

     </b>

<soap:c></c>

</a> 

써본지 오래된지라 기억이 가물가물하지만 아마도 b1에 접근하기 위해선 2.0에서는 이러면 되었다.

xPathAPI를 써서 var qq:Array = seletNode(“/a/b/b1”); 해서 배열에 싹 저장하고 이걸 qq.firstChild.childNode[0] 뭐 이런식으로 하면 참조가 되었다.

 그런데 3.0에서는 xmlObj 객체에 저장한후, xmlObj.soap::b[0].xx::b1 으로 해야한다.

 

물론 이걸 이렇게 간편화 할 수 있긴하다.

xmlObj..xx::b1 

하지만 좀 복잡하고 거대한 xml문서를 만났을때는 .과 ::의 혼돈속에서 보기에도 불편한 path를 정의해줘야 한다. 간편화 할 수 있는 클래스를 만들던가 XMLList를 써서 간접 참조를 하든가 해야 이로부터 비롯된 짜증을 좀 만회 할 수 있을 듯 하다.

 

알아낸 사실  뭐냐하면 xml문서의 네임스페이스를 런타임에 “”로 공백화 시켜버리는 것이다.

 xSheet = new XML(loader.data); 

if (xSheet.namespace(“”) != undefined){
      default xml namespace = xSheet.namespace(“”);
}

이렇게 하면 참조시 접두어를 쓸 필요가 없다. 그러나 xml노드의 로컬네임 자체에 접두어가 있는 경우는 여전히 출력이 되지 않는다. 네임스페이스가 정의되어 있지만, 실제 엘레먼트 로컬네임이나 어트리뷰트에 접두어가 없다면 편리하게 사용가능 할 것이다.

Advertisements
태그: ,

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

일자별 보기

12월 2007
« 11월   1월 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

최근 사진

%d 블로거가 이것을 좋아합니다: