C#은 너무 친절해…

C#은 너무 친절해… 그래서 짜증나… 므니다.. 무슨 말씀인고 허니.. C#에서 URL을 통해 웹페이지를 호출하는 코드가 있습니다.. 예를 들어서..

String urlAddress = "http://www.geoservice.co.kr:7070/wms?a|b|c";
WebRequest request = WebRequest.Create(urlAddress);

...

뭐.. 대충 위와 같은 식으로 url을 날렸더니.. url을 구성하는 문자중 |을 자동으로 %7C로 인코딩 해주십니다.. 와우~ 너무 친절하시네.. 하지만 내가 원하는 것은 그냥 | 문자를 고대로 서버로 날려야 합니다. 해서 찾아보니.. url을 문자열 그대로 날리지 않고 Uri라는 클래스를 통해 날리는 방법이 있더군요. 그래서 다음처럼 코딩했습니다.

String urlAddress = "http://www.geoservice.co.kr:7070/wms?a|b|c";
Uri uri = new Uri(urlAddress, true);
WebRequest request = WebRequest.Create(uri);

...

새롭게 추가된 2번 코드가 바로 그 녀석입니다. Uri 클래스 객체를 생성자의 두번째 인자값을 true로 주면 자동으로 |를 %7C 따위로 인코딩해주지 않아.. 제가 원하는 방법입니다. 근데 이 방식이 Deprecated 된 방식이랍니다. ㅡOㅡ;; 그럼 이와 동일한 기능을 하면서 권장하는 방식이 무엇이냐? 라고 열심히 구글링을 해봤지만 모르겠네요.. 아시는 분 계시나요?

여튼.. C#은 내부적으로 자동으로 처리해 주는 것들이 제법 있습니다. C#은 너무 친절합니다.. 그래서.. 가끔씩 맘에 않듭니다..

[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을 쿼리하는 방식은 그리 매력적이라고 느껴지지 않습니다..