공룡호가 사는 세상 이야기

naver OpenAPI의 내PC 검색은 일반적인 검색과 리턴 값이 달랐다.
일반적인 openAPI의 리턴값은 다음과 같다. 예를들어 검색 api는 다음과 같은 XML을 리턴한다.
<?xml version="1.0" encoding="UTF-8" ?>
- <rss version="2.0">
- <channel>
  <title>Naver Open API - webkr ::'go'</title>
  <link>http://search.naver.com</link>
  <description>Naver Search Result</description>
  <lastBuildDate>Tue, 11 Apr 2006 14:36:33 +0900</lastBuildDate>
  <total>18992582</total>
  <start>1</start>
  <display>10</display>
- <item>
  <title><b>GO</b>.com</title>
  <link>http://www.go.com/</link>
  <description>... Victims, Military Personnel Sell Rations Online Government Report Finds Ready-to-Eat Meals for Sale on eBay...... trailers and the latest buzz on... Harry Potter and the Goblet of Fire , X-Men 3 , Spider-Man 3 , more... Tonight...</description>
  </item>

보면 알겠지만 <TAG>TEXT</TAG> 형식으로 구성되어 있으므로 파싱하기가 편리하다.
직접 파싱을 해도 되지만, C#에서 파서를 제공해 주는데 굳이 할 필요는 없지 않은가.
최초 XML을 접하고 파싱에 애를 먹어 각지의 도움을 얻었었다. 그리고 준일님께서 도와주셨다.

웹서비스는 XML 을 이용한 HTTP 간의 통신 방법이다.
이 기술이 현재 각광을 받는 이유는 방화벽간에 통신을 위한 포트가 아닌,
HTTP 로 어떤 플랫폼에서도 인식이 가능한 규격화된 텍스트 형식, 즉 XML 이라는 것이다.

DataSet 이란 클래스는 무수한 기능을 가진 컬렉션이다.
이부분은 ADO.NET에 대해서 더 공부하면 알겠지만, 메모리 상의 작은 데이터베이스라고 칭할만큼 무수한 기능이 많다.
DataSet 의 ReadXml 이란 메서드는 XML 형식의 데이터를 DataSet 으로 파싱할 수 있게 된다.
(단, 모든 DataSet 에 변환가능한 형식 이어야 한다.)

파싱의 예는 다음과 같다.
string QueryURL = "쿼리문"
XmlTextReader txtReader = new XmlTextReader(QueryURL);
while(txtReader.Read())
{
 if(txtReader.NodeType == XmlNodeType.Element)
 Response.Write(txtReader.Name + " : ");
 if(txtReader.NodeType == XmlNodeType.Text)
 Response.Write (txtReader.Value + "<br>");
}

쿼리문을 던져 해당 노드의 타입을 보고 Element와 Text를 구분하여 출력해 주는 예제이다.
하지만, 문제가 있다.
naver 내PC 검색의 리턴XML의 출력은 표준 형식인 RSS 2.0 형식 (http://blogs.law.harvard.edu/tech/rss)을 따른다.
표준 RSS에 내PC검색 API용으로 추가된 태그는 nns XML namespace를 가진다.

<?xml version="1.0" encoding="UTF-8" ?>
- <rss version="2.0" xmlns:nns="http://mypc.naver.com/nnsrss">
- <channel>
  <title>Naver OpenAPI - MyPC Search Result</title>
  <link>http://127.0.0.1:4311/openapi/search?key=mypc&query=%BF%E4%BF%F8</link>
  <description>Naver MyPC Search Result</description>
  <language>ko</language>
  <generator>Nano Search 2.0</generator>
  <nns:total>5</nns:total>
  <nns:start>1</nns:start>
  <nns:display>5</nns:display>
  <nns:errorcode>0</nns:errorcode>
- <item>
- <title>
<![CDATA[alias.2x03.cipher.ws_dvdrip_xvid-fov.avi  ]]>
  </title>
- <link>
<![CDATA[G:\alias.s02\alias.2x03.cipher.ws_dvdrip_xvid-fov.avi  ]]>
  </link>
- <description>
- <![CDATA[ 

와 같은 형식은 <TAG><![CDATA[TEXT]]</TAG> 형식이다. 위의 파싱 방법으로 파싱을 할 경우에는, 올바로 파싱이 되지 않는다. <![ 형식을 Element로 판단하지 못하고 무시해 버린다.
위 파싱 방법의 소스 중, Value는 Xml Element 의 내용을 그대로 가져오게 된다.
ReadElementString() 메서드를 사용하면 말끔히 해결된다.
다음 예제는 이러한 문제도 말끔히 해결된다.

XMLFile1.XML
<?xml version="1.0" encoding="utf-8" ?>
<title><![CDATA[타이틀]]></title>
Program.CS
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace ConsoleTest
{
 class Program
 {
  static void Main(string[] args)
  {
   XmlTextReader reader = new XmlTextReader("../../XMLFile1.xml");
   while (reader.Read())
   {
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "title")
     Console.WriteLine(reader.ReadElementString());
   }
   reader.Close();
  }
 }
}

이상. XML의 파싱은 여기까지.
XML을 적절히 파싱한다면, 이를 이용하는 방법은 헤아릴 수도 없을 정도일 것이다.
이것이 XML의 강점(?) 이며, openAPI의 매력일지도 모르겠다. *-_-*