1. 개요
.NET Framework 3.5에 포함된 LINQ의 기능 중 XML 문서를 처리하는 방법에 대해 알아본다.
여기서 XML 문서는 Naver OpenAPI에 있는 이미지 검색 Response로 오는 RSS 2.0 Spec의 형식이다.
2. Naver OpenAPI를 사용하려면
Naver의 OpenAPI는 다른 사이트와 마찬가지로 apikey를 발급을 받아야 한다.
OpenAPI( http://openapi.naver.com/index.nhn ) 사이트로 가서 API 이용등록 수정 ( http://openapi.naver.com/register.nhn ) 메뉴를 참고하여 일반키를 발급 받도록 하자.
검색 결과 API는 총 16가지가 있다.
(지식 IN, 블로그, 카페/카페글, 전문자료, 웹문서, 책, 쇼핑, 백과사전, 국어사전, 일어사전, 영어사전, 뉴스, 지역, 동영상, 이미지, 내PC)
이 중 여기서는 이미지 검색을 하도록 한다. ( http://openapi.naver.com/page.nhn?PageId=1_15 )
요청변수는 아래 그림을 참고한다.
http://openapi.naver.com/search?key=test&query=go&target=image&start=1&display=10 를 이용하여 확인하며 RSS 2,0 스펙으로 응답이 오는 것을 알 수 있다. 이제 이 스펙을 참조하여 LINQ를 사용해보자.
http://openapi.naver.com/sample/image.xml
3. LINQ 사용하기
LINQ를 사용하면 XML 문서를 간단히 객체화 할 수 있다.
string url = string.Format("http://openapi.naver.com/search?key={0}&query={1}&target=image&start=1&display=12", _apikey, query);
XDocument xdoc = XDocument.Load(url);
var result = from item in xdoc.Descendants("item")
select new
{
Title = item.Element("title").Value,
Link = item.Element("link").Value,
Thumbnail = item.Element("thumbnail").Value
};
_flowLayoutPanel.Controls.Clear();
foreach (var searchResult in result)
{
AsyncListItem item = new AsyncListItem(); // AsyncListItem은 단지 제가 만든 UserControl일 뿐입니다.
item.Size = new Size(100, 100);
item.Text = searchResult.Title;
item.ImageURI = searchResult.Thumbnail;_flowLayoutPanel.Controls.Add(item);
}
XDocument class XML을 다루는 class로서 웹 uri를 참조할 수 있는 Load라는 static 메소드를 제공한다.
발급 받은 API KEY와 Query할 문자열로 uri를 구성하여 Load 함수를 호출한다.
C# 3.0 Spec에 Query Expression 이라는 것이 새롭게 추가되었다.
from, in, where, select, group, into, orderby, joint, let 등의 키워드를 사용할 수 있고 그것들을 마치 SQL문 형식처럼 사용할 수 있다.
그러나 기존의 SQL은 SELECT * from [TABLE] WHERE [Expr] 이런 식이였다면
C#의 Query Expression은 select가 제일 뒤에 붙는다는 점이 차이점이라고 할 수 있다.
그러나 잘 생각해 보면 보통 DB에서 쿼리를 할 때 SELECT 부분이 제일 나중에 수행되기 때문에 C#에서의 select의 위치가 어쩌면 당연하다고 볼 수 있다.
select 다음에 new 로 Anonymous Type의 객체를 생성하는 부분을 볼 수 있는데, 이또한 C# 3.0에 새롭게 제공되는 기능이다.
Query Expression의 결과로 나오는 var result는 IEnumerable<Anonymous Type>의 형식으로 떨어지게 되고,
이 Anonymous Type을 생성하면서 사용한 Title, Link, Thumbnail은 Property로 등록되게 된다.
그렇게 때문에 foreach를 사용하여 result 를 사용할 수 있는데 위의 코드를 보면 알겠지만 Anonymous Type의 Property로 접근하는 것을 확인 할 수 있다.
4. 샘플 프로젝트
AsyncListItem이라는 UserControl을 만들었는데 단순히 PictureBox와 Label 컨트롤을 포함시킨 것 밖에는 없다.
ListView를 사용할 수도 있었지만, 사진을 받아오는 부분을 비동기로 구현하기가 좀 까다로운 부분이 있어서
PictureBox의 LoadAsyn를 사용하여 비동기로 이미지를 받게 쉽게 구현하였다.
( 이 샘플의 목적은 LINQ와 OpenAPI를 설명하기 위함이다. )
주의 : api는 꼭 본인이 발급받아서 사용하기 바란다.
Release binary 를 실행하려면 꼭 .NET Framework 3.5 가 깔려있어야 한다.