프로그램/C#

C# xml 파싱하기

더월드 2023. 9. 15.

우선적으로 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 ::&apos;사고&apos;</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>한국지역난방공사(사장 정용기)는 추석연휴에 안정적인 지역난방 공급 및 재난·안전&lt;b&gt;사고&lt;/b&gt; 예방을 위해 14일을... 감전 &lt;b&gt;사고&lt;/b&gt; 예방을 위한 현장 상황을 점검했다. 아울러 공사는 전 임직원의 안전의식 고취를 위해 현장에서... </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 파싱이 잘 되었습니다.

댓글

💲 추천 글