C#으로 openAPI 이용. 그리고 XML의 파싱
프로그래밍2007. 4. 4. 00:55
naver OpenAPI의 내PC 검색은 일반적인 검색과 리턴 값이 달랐다.
일반적인 openAPI의 리턴값은 다음과 같다. 예를들어 검색 api는 다음과 같은 XML을 리턴한다.
보면 알겠지만 <TAG>TEXT</TAG> 형식으로 구성되어 있으므로 파싱하기가 편리하다.
직접 파싱을 해도 되지만, C#에서 파서를 제공해 주는데 굳이 할 필요는 없지 않은가.
최초 XML을 접하고 파싱에 애를 먹어 각지의 도움을 얻었었다. 그리고 준일님께서 도와주셨다.
일반적인 openAPI의 리턴값은 다음과 같다. 예를들어 검색 api는 다음과 같은 XML을 리턴한다.
<?xml version="1.0" encoding="UTF-8" ?>
<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>
<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 에 변환가능한 형식 이어야 한다.)
파싱의 예는 다음과 같다.
쿼리문을 던져 해당 노드의 타입을 보고 Element와 Text를 구분하여 출력해 주는 예제이다.
하지만, 문제가 있다.
naver 내PC 검색의 리턴XML의 출력은 표준 형식인 RSS 2.0 형식 (http://blogs.law.harvard.edu/tech/rss)을 따른다.
표준 RSS에 내PC검색 API용으로 추가된 태그는 nns XML namespace를 가진다.
와 같은 형식은 <TAG><![CDATA[TEXT]]</TAG> 형식이다. 위의 파싱 방법으로 파싱을 할 경우에는, 올바로 파싱이 되지 않는다. <![ 형식을 Element로 판단하지 못하고 무시해 버린다.
위 파싱 방법의 소스 중, Value는 Xml Element 의 내용을 그대로 가져오게 된다.
ReadElementString() 메서드를 사용하면 말끔히 해결된다.
다음 예제는 이러한 문제도 말끔히 해결된다.
이상. XML의 파싱은 여기까지.
XML을 적절히 파싱한다면, 이를 이용하는 방법은 헤아릴 수도 없을 정도일 것이다.
이것이 XML의 강점(?) 이며, openAPI의 매력일지도 모르겠다. *-_-*
파싱의 예는 다음과 같다.
string QueryURL = "쿼리문"
XmlTextReader txtReader = new XmlTextReader(QueryURL);
XmlTextReader txtReader = new XmlTextReader(QueryURL);
while(txtReader.Read())
{
if(txtReader.NodeType == XmlNodeType.Element)
Response.Write(txtReader.Name + " : ");
{
if(txtReader.NodeType == XmlNodeType.Element)
Response.Write(txtReader.Name + " : ");
if(txtReader.NodeType == XmlNodeType.Text)
Response.Write (txtReader.Value + "<br>");
}
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" ?>
<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>
와 같은 형식은 <TAG><![CDATA[TEXT]]</TAG> 형식이다. 위의 파싱 방법으로 파싱을 할 경우에는, 올바로 파싱이 되지 않는다. <![ 형식을 Element로 판단하지 못하고 무시해 버린다.
위 파싱 방법의 소스 중, Value는 Xml Element 의 내용을 그대로 가져오게 된다.
ReadElementString() 메서드를 사용하면 말끔히 해결된다.
다음 예제는 이러한 문제도 말끔히 해결된다.
XMLFile1.XML
<?xml version="1.0" encoding="utf-8" ?>
<title><![CDATA[타이틀]]></title>
<?xml version="1.0" encoding="utf-8" ?>
<title><![CDATA[타이틀]]></title>
Program.CS
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
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();
}
}
}
{
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의 매력일지도 모르겠다. *-_-*
'프로그래밍' 카테고리의 다른 글
매시업 데이터 (0) | 2007.04.15 |
---|---|
동적으로 생성된 컨트롤의 이벤트 처리시 넘기는 인자값으로 인한 문제 (0) | 2007.04.07 |
WEB 2.0 관련자료 (0) | 2007.03.27 |
DefiningSOA as an Architectural Style (0) | 2007.03.27 |
IBM develperWorks Report #1 (0) | 2007.03.27 |