[ActionScript] 서버로부터 이미지를 받아 BitmapData 타입으로 얻기

글 제목이.. 테크니컬합니다만.. Flex에서 서버에 위치한 이미지 파일을 다운로드 받아서.. 받은 이미지를 지지고 볶기 위해 BitmapData라는 타입으로 변환하고자 할때 사용하는 코드입니다.

이미지가 서버에 있으므로 URL로 경로를 지정할 수 있겠지요?  아래가 이미지에 대한 URL을 통해 다운로드 작업의 시동을 걸어 주는 코드입니다.

var ldr:Loader = new Loader();
var req:URLRequest = new URLRequest("http://www.gisdeveloper.co.kr/img/downskin.png");

ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onRequestComplete);
ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onRequestError);

ldr.load(req);

4번과 5번 코드는 다운로드가 성공적으로.. 때로는 문제가 생겨 실패했을시 발생하는 이벤트를 지정해주는 코드입니다. 성공적으로 받았을때 받은 데이터를 BitmapData 타입으로 변환하는 코드가 존재할텐데요.. 그렇다면 성공적으로 다운로드 되었을때 발생하는 이벤트에 대한 코드를 살펴면 다음과 같습니다.

private function onRequestComplete(event:Event):void
{
    var ldr:Loader = event.target.loader as Loader;
    var img:Bitmap = ldr.content as Bitmap;
    
    trace(img.bitmapData.width, img.bitmapData.height);
}

6번째 코드를 통해 다운로드 받은 이미지의 크기를 플래시 빌더의 디버깅 창에 표시해 보고 있습니다.

끝으로… 플래시는 모든 연산이 비동기화 지향적입니다. 플래시가 화면상에 화려하고 역동적인 그래픽 요소의 표현이라는 주요 목적을 갖고 있으니 당연한 것이긴 하지만…… 때론 이런 비동기적인 방식이 코드를 복잡하게 만들때가 있습니다.. 위의 경우에서도 이미지 하나를 받기 위해 비동기방식으로 이벤트를 지정해줘서 처리를 하고 있는데… 이를 동기적으로 처리할 수 있는 방법이 있다면 좋겠다는 생각이 듭니다만… 혹.. 아시는 분 계시나요?

[C#] LINQ를 이용한 XML 파싱 쿼리

“XML에서 원하는 데이터 검색하기”에서 XML을 쿼리하는 방법을 학습한 뒤에 LINQ를 이용해 XML을 쿼리 하는 방법도 학습해 보았습니다. “XML에서 원하는 데이터 검색하기”에서 사용한 동일한 XML 데이터를 이용했고.. 그 쿼리 대상도 동일하게 했습니다. 다시 한번 쿼리 대상을 살펴보면…

  1. <book>의 개수는?
  2. 두번째 <book>의 <title>의 값은?
  3. 두번째 <book>의 genre의 값은?
  4. 두번째 <book>의 <author>의 <first-name>의 값은?

위에 대한 결과는 다음과 같습니다.

  1. 3
  2. The Confidence Man
  3. novel
  4. Herman

Linq를 이용해 위의 쿼리 대상의 결과를 얻어 내는 코드를 하나 하나 들어 보기에 앞서 LINQ를 XML에 적용하기 위한 준비 코드가 필요하며 다음과 같습니다.

XmlTextReader reader = new XmlTextReader("books.xml");
XElement xml = XElement.Load(reader);

var books = from item in xml.Descendants("book") select item;

여기서 4번 코드가 바로 LINQ입니다. 사실.. XML에서 원하는 데이터를 쿼리 하는 기능은 LINQ의 기능중 작은 부분을 차지 하고 있어 그리 크게 느껴지지 않습니다.

뭐 여튼…… 이제 우리의 목표를 하나 하나 이뤄보겠습니다. 먼저 “<book>의 개수는?”에 대한 코드입니다.

Console.WriteLine(books.Count());

다음은 “두번째 <book>의 <title>의 값은?”에 대한 코드입니다.

Console.WriteLine(
    books.ElementAt(1).Descendants("title").ElementAt(0).Value
);

그리고 세번째로 “두번째 <book>의 genre의 값은?”에 대한 코드입니다.

Console.WriteLine(books.ElementAt(1).Attribute("genre").Value);

끝으로 “두번째  <book>의 <author>의 <first-name>의 값은?”에 대한 코드입니다.

Console.WriteLine(
    books.ElementAt(1).Descendants("author").Descendants("first-name")
        .ElementAt(0).Value
);

제가 LINQ를 제대로 이해하고 있지 않은 이유일까요? LINQ를 이용해 XML에서 원하는 데이터를 쿼리하는 간결하고 직관적인 코드가 존재하지 않을까… 하는 생각이 듭니다. 바로 이런 이유가 LINQ의 이유 중에 하나이니까요… 앞서 언급했지만.. XML에서 원하는 데이터를 쿼리 하는 기능은 LINQ의 기능중 작은 부분을 차지 하고 있는듯하여 LINQ를 통해 XML을 쿼리하는 방식은 그리 매력적이라고 느껴지지 않습니다..

[C#] XML에서 원하는 데이터 검색하기

C#에서 XML 데이터를 처리해야할 기능이 필요하여 이리 저리 찾은 내용을 정리한 글입니다. 먼저 사용할 XML 데이터는 아래와 같다고 하겠습니다.


    
        
            The Autobiography of Benjamin Franklin
            
                Benjamin
                Franklin
            
            8.99
        
        
            The Confidence Man
            
                Herman
                Melville
            
            11.99
        
        
            The Gorgias
            
                Plato
            
            9.99
        

가장 먼저 위의 XML 데이터를 쉽게 조회하기 위해 트리 형태로 구성하기 위한 준비 코드는 다음과 같습니다.

XmlTextReader reader = new XmlTextReader("books.xml");
XmlDocument xdoc = new XmlDocument();
xdoc.Load(reader);

자.. 이제 부터 원하는 데이터를 얻어 낼 수 있는데요. 다음과 같이 네 가지의 목표를 정하고 목표를 이루어 나가 보겠습니다.

  1. 은 몇개인가?
  2. 두번째 의의 값은 무엇인가?
  3. 두번째 의 속성 genre의 값은 무엇인가?
  4. 두번째 의 의 의 값은 무엇인가?

먼저 답은 다음과 같습니다.

  1. 3개
  2. The Confidence Man
  3. novel
  4. Herman

위의 답을 내어 내기 위한 코드를 하나 하나 제시해 보면 다음과 같습니다.

“은 몇개인가?”에 대한 코드

XmlNodeList bookNodes = xdoc.DocumentElement.SelectNodes("book");
Console.WriteLine(" 노드의 개수: " + bookNodes.Count);

“두번째 의의 값은 무엇인가?”에 대한 코드

XmlNode titleNode = bookNodes[1].SelectSingleNode("title");
Console.WriteLine("두번째 의의 값은: " + titleNode.InnerText);

“두번째 의 속성 genre의 값은 무엇인가?”에 대한 코드

String genre = bookNodes[1].Attributes["genre"].Value;
Console.WriteLine(genre);

끝으로.. “두번째 의 의 의 값은 무엇인가?”에 대한 코드

String firstName = bookNodes[1].SelectSingleNode("author")
    .SelectSingleNode("first-name").InnerText;
Console.WriteLine(firstName);

끝으로 이보다 효율적인 방법이 존재하겠지요? 알고 계시다면 한수 부탁드립니다!