우선적으로 xml을 파싱 테스트를 위해서
네이버 API를 이용하여 네이버 뉴스를 검색하는 코드를 작성해 볼께요.
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
namespace Naver_news
{
internal class Program
{
static void Main(string[] args)
{
string _clientId = "네이버API ID";
string _clientSecret = "네이버API 비밀번호";
string query = "사고"; // 검색할 문자열
string url = "https://openapi.naver.com/v1/search/news.xml?query=" + query; // XML 결과
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add("X-Naver-Client-Id", _clientId); // 클라이언트 아이디
request.Headers.Add("X-Naver-Client-Secret", _clientSecret); // 클라이언트 시크릿
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string status = response.StatusCode.ToString();
if (status == "OK")
{
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
else
{
Console.WriteLine("Error 발생=" + status);
}
}
}
}
네이버 api 사용하여 뉴스 검색 결과 값은 받으면 아래와 같은 형태의 xml이 출력됩니다.
네이버 뉴스 (xml)
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Naver Open API - news ::'사고'</title>
<link>https://search.naver.com</link>
<description>Naver Search Result</description>
<lastBuildDate>Fri, 15 Sep 2023 20:47:11 +0900</lastBuildDate>
<total>9334440</total>
<start>1</start>
<display>10</display>
<item>
<title>한국지역난방공사, 추석연휴 대비 경영진 특별 안전점검 실시</title>
<originallink>https://www.newscj.com/news/articleView.html?idxno=3064056</originallink>
<link>https://www.newscj.com/news/articleView.html?idxno=3064056</link>
<description>한국지역난방공사(사장 정용기)는 추석연휴에 안정적인 지역난방 공급 및 재난·안전<b>사고</b> 예방을 위해 14일을... 감전 <b>사고</b> 예방을 위한 현장 상황을 점검했다. 아울러 공사는 전 임직원의 안전의식 고취를 위해 현장에서... </description>
<pubDate>Fri, 15 Sep 2023 20:42:00 +0900</pubDate>
</item>
.....
</item>
</channel>
</rss>
위 결과값에서 원하는 내용만 취하려면 xml 파싱을 해야 합니다.
C#에서는 기본적으로 xml 파싱을 지원합니다.
● SelectNodes(XmlNode, String) : 지정한 XPath 식과 일치하는 노드의 목록을 선택합니다.
● SelectSingleNode(XmlNode, String) : XPath 식과 일치하는 첫 번째 노드를 선택합니다.
// 수신된 XML형식의 데이터를 컨트롤하기위해 XmlDocument 인스턴스를 생성
XmlDocument xdoc = new XmlDocument();
// Stream결과를 XML형식으로 읽어오기
xdoc.LoadXml(text);
// <rss></rss> 기준으로 node 생성
XmlNode node = xdoc.SelectSingleNode("rss");
// <channel></channel> 기준으로 node 생성
XmlNode n = node.SelectSingleNode("channel");
// 뉴스 기사 개수 구하기
int display = int.Parse(n.SelectSingleNode("display").InnerText);
// <item> 기준으로 node 값 읽어 오기
XmlNodeList items = n.SelectNodes("item");
// i번째 기사 읽기
for (int i = 0; i < display; i++)
{
//string name_value = items[i].InnerText;
//Console.WriteLine(name_value);
var title = items[i].SelectSingleNode("title").InnerText;
var description = items[i].SelectSingleNode("description").InnerText;
var link = items[i].SelectSingleNode("link").InnerText;
var pubDate = items[i].SelectSingleNode("pubDate").InnerText;
}
네이버 뉴스 검색 후 xml 결과값을 받아서 파싱하는 코드는 아래와 같습니다.
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
namespace Naver_news
{
internal class Program
{
static void Main(string[] args)
{
string _clientId = "네이버API ID";
string _clientSecret = "네이버API 비밀번호";
string query = "사고"; // 검색할 문자열
string url = "https://openapi.naver.com/v1/search/news.xml?query=" + query; // XML 결과
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add("X-Naver-Client-Id", _clientId); // 클라이언트 아이디
request.Headers.Add("X-Naver-Client-Secret", _clientSecret); // 클라이언트 시크릿
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string status = response.StatusCode.ToString();
if (status == "OK")
{
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
string text = reader.ReadToEnd();
//Console.WriteLine(text);
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(text);
XmlNode node = xdoc.SelectSingleNode("rss");
XmlNode n = node.SelectSingleNode("channel");
int display = int.Parse(n.SelectSingleNode("display").InnerText);
XmlNodeList items = n.SelectNodes("item");
for (int i = 0; i < display; i++)
{
//string name_value = items[i].InnerText;
//Console.WriteLine(name_value);
var title = items[i].SelectSingleNode("title").InnerText;
var description = items[i].SelectSingleNode("description").InnerText;
var link = items[i].SelectSingleNode("link").InnerText;
var pubDate = items[i].SelectSingleNode("pubDate").InnerText;
Console.WriteLine(string.Format("제목: {0}:", title));
Console.WriteLine(string.Format("내용: {0}:", description));
Console.WriteLine(string.Format("URL: {0}:", link));
Console.WriteLine(string.Format("작성일: {0}:", pubDate));
Console.WriteLine("\n");
}
}
else
{
Console.WriteLine("Error 발생=" + status);
}
}
}
}
코드 실행 결과, xml 파싱이 잘 되었습니다.
'공학속으로 > C#' 카테고리의 다른 글
[C#] MM-dd-yyyy HH:mm:ss를 yyyy-dd-mm 형태로 날짜 포멧 변경하기 (0) | 2023.12.16 |
---|---|
C# 디렉토리에 있는 csv 파일을 utf-8 bom 파일로 변경하기 (1) | 2023.11.29 |
C# json 파싱하기 (0) | 2023.09.05 |
[C#] DLL을 포함한 단일 EXE배포 방법 (0) | 2023.09.04 |
C# Naver Api 사용하여 네이버 뉴스 검색하기 (1) | 2023.09.01 |
댓글