본문 바로가기

programming/Open API

옥답OpenApi 두 번째 (지역 뉴스 정보)

 가격정보 다음에 지역뉴스정보 OpenApi 입니다 .쓰는 방법은 비슷합니다. 참고로 뉴스 본문 중간중간에 이미지가 있어서(Xml 속성이 텍스트 속성 따로, 이미지 속성 따로 있는게 아니라 하나의 속성에 뭉쳐져 있더군요) 고민에 고민을 하여 소스를 보시면 아시겠지만 허접하게 해결했습니다;;  "http~ .jpg" 찾아내어서 배열에 담은 후 그 배열을 이미지를 띄우는 형식으로 처리했습니다. 그리고 글과 이미지가 순서가 골고루 되어 있지않아서 RichTextBox에 띄우는데 애점 먹었습니다. 그냥 글띄우고 이미지를 순서대로 띄우는 형식으로 -0-;; 그래서 그림만 덜렁 하나만 나올때도 있고, 막 거시기하더군요;;  암튼 주저리 주저리 떠들고 고고씽합니다;;;


<실행화면>

l  전역 부분

int NewsNum; //소식인덱스담는변수

int codenum;  //지역별코드

ArrayList Contens = new ArrayList();  //뉴스본문을 담는 ArrayList

ArrayList ListInfo = new ArrayList(); //뉴스 리스트를 담는 ArrayList

String[] News = { "1", "2" };  //소식종류코드

String[] Area = { "1000", "2000", "3000", "4000", "5000", "6000", "7000", "8000", 9000" };  //지역별 코드

 

l  ImageURL 주소를 비트맵IMAGE로 바꿔주는 함수

public BitmapImage LoadImage(string url)   //ImageURL 주소를 비트맵IMAGE로 바꿔주는 함수

{

    try

    {

        if (string.IsNullOrEmpty(url))

          return null;

 

        WebClient wc = new WebClient();

        Byte[] MyData = wc.DownloadData(url);

        wc.Dispose();

        BitmapImage bimgTemp = new BitmapImage();

        bimgTemp.BeginInit();

        bimgTemp.StreamSource = new MemoryStream(MyData);

        bimgTemp.EndInit();

        return bimgTemp;

    }

    catch

    {

        return null;

    }

}

 

l  로드시

private void Window_Loaded(object sender, RoutedEventArgs e)  //초기 셋팅

{

    NewsCombo.Items.Add("내고장소식");

    NewsCombo.Items.Add("정보화마을소식");

 

    AreaCombo.Items.Add("서울/인천/경기");

    AreaCombo.Items.Add("강원");

    AreaCombo.Items.Add("충북");

    AreaCombo.Items.Add("대전/충남");

    AreaCombo.Items.Add("전북");

    AreaCombo.Items.Add("광주/전남");

    AreaCombo.Items.Add("대구/경북");

    AreaCombo.Items.Add("부산/울산/경남");

    AreaCombo.Items.Add("제주");

 

    RangeCombo.Items.Add("5");

    RangeCombo.Items.Add("10");

    RangeCombo.Items.Add("15");

 

    RangeCombo.Text = "5";  //범위ComboBox 5로 초기화

    NewsCombo.Text = "내고장소식"; // 뉴스항목 ComboBox내고장소식으로 초기화

    AreaCombo.Text = "서울/인천/경기"; // 지역 ComboBox서울/인천/경기로 초기화

}

 

l  지역을 선택했을 시

private void AreaCombo_SelectionChanged(object sender, SelectionChangedEventArgs e) //지역을 선택했을 때

{

    ComboBox currentComboBox = sender as ComboBox;

    XmlDocument doc = new XmlDocument();

    if (currentComboBox != null)

    {

        codenum = currentComboBox.SelectedIndex;

                doc.Load(String.Format("http://openapi.okdab.com/news/newsxml.jsp?key=c83ca4580ed2eb6989a520412d63145a&newskind={0}&code={1}&snum=1&enum={2}",

         News[NewsNum], Area[codenum],RangeCombo.Text));

        // 요청URL(뉴스항목코드,지역코드, 범위 요청변수를 삽입) Load시킴  

     }

      String contentnum;

      int index;

 

      XmlNode currentNode = doc.SelectSingleNode("news");

      index = currentNode.SelectNodes("result").Count;

 

      SubJectList.Items.Clear();

      Contens.Clear();

for (int i = 0; i < index; i++)

      {

         XmlNode result = currentNode.SelectNodes("result")[i];

         contentnum = result.SelectSingleNode("contentnum").InnerText;

           Contens.Add(contentnum);

           subject = result.SelectSingleNode("subject").InnerText;

           SubJectList.Items.Add(subject);

       }

       SubJectList.SelectedIndex = 0;  

 //뉴스제목 comboBox의 기본값을 인덱스 0으로 초기화 시켜줌

}

 

l  뉴스 제목을 선택했을 시

private void SubJectList_SelectionChanged(object sender, SelectionChangedEventArgs e) //뉴스제목을 선택했을 때

{

    if (SubJectList.SelectedIndex == -1)  //제목리스트 index -1이 들어올 경우

    {

         SubJectList.Items.Add(subject);

         SubJectList.Items.Clear();   

         return;

    }

 

    richTextBox1.SelectAll();

    Clipboard.Clear();

    int list = SubJectList.SelectedIndex;

           

    XmlDocument doc = new XmlDocument();

            doc.Load(String.Format("http://openapi.okdab.com/news/newsxml_content.jsp?key=c83ca4580ed2eb6989a520412d63145a&newskind={0}&contentnum={1}", News[NewsNum], Contens[list]));

    // 요청URL(뉴스항목코드,제목코드 요청변수를 삽입) Load시킴

          

    String count;

    String content, contentnum, contentDate, journalist;

    int index;

 

    XmlNode currentNode = doc.SelectSingleNode("news");

    index = currentNode.SelectNodes("result").Count;

count = currentNode.SelectSingleNode("count").InnerText;

 

string[] Imgurl;                    //Image url 주소

    string[] url = new string[30];      //image url 주소

    string[] Erase;                     //불필요한 부분들을,삭제할 것을 담을 배열

 

    for (int i = 0; i < index; i++)

    {

         XmlNode result = currentNode.SelectNodes("result")[i];

         contentnum = result.SelectSingleNode("contentnum").InnerText;

         content = result.SelectSingleNode("content").InnerText;

 

         content = Regex.Replace(content, "<br>", "\n");   //<br>삭제

         content = Regex.Replace(content, "<IMG alt=" + '"' + '"', string.Empty);

//<IMG > 삭제

         content = Regex.Replace(content, "src=" + '"', string.Empty);  //src="" 삭제

 

         Imgurl = content.Split(new string[] { "http", "jpg" }, StringSplitOptions.None);

           //http ~ .jpg 문자열을 잡음

          Erase = content.Split(new string[] { "DIV", "}" }, StringSplitOptions.None);

          //DIV~ } 문자열을 잡음

          String aaa;

          if (Imgurl.Length == 1)  //Imgurl 길이가 1일때

          {

              if (Erase.Length == 1)  //Erase 길이가 1일 때

              {

                 Clipboard.Clear();

                 Clipboard.SetText(content); //클립보드에 뉴스본문을 수정

                 richTextBox1.Paste();  //RichTextBox에 복사

              }

              else

              {

                 aaa = Erase[Erase.Length - 1];

                 Clipboard.Clear();

                 Clipboard.SetText(aaa);

                 richTextBox1.Paste();

              }

          }

else

         {

             try

             {

                 for (int j = 1; j < Imgurl.Length; j += 2)

                 {

                    url[j] = string.Format("{0}{1}{2}", "http", Imgurl[j], "jpg");

                    //http ~ .jpg(image url주소) url[]에 대입

                    Clipboard.Clear();

                    Clipboard.SetText(Imgurl[j - 1] + "\n");

                    //http ~ .jpg (image Url주소)를 제외 한 부분(텍스트)을 수정

                    richTextBox1.Paste();  //RichTextBox에 복사

                    Clipboard.SetImage(LoadImage(url[j])); 

                    richTextBox1.Paste();

                    //ImageUrl 주소를 LoadImage함수를 이용해 BigmapImage로 바꿔주고

                    //클립보드에 수정후 RichTextBox에 붙임                       

                    content = Regex.Replace(content, url[j], string.Empty);

                    //http ~ .jpg (image 주소)는 삭제시킴

                 }

             }

             catch { return; }

          }

 

         contentDate = result.SelectSingleNode("contentDate").InnerText;

         journalist = result.SelectSingleNode("journalist").InnerText;

 

         Title.Content = SubJectList.Items[list].ToString() + " (기사날짜 : " +       contentDate + ")";

         label7.Content = journalist + " 기자";

         }

}

}


<소스 첨부 한번 해봅니다.>

'programming > Open API' 카테고리의 다른 글

[WPF] 구글 날씨 OpenApi  (3) 2011.07.28
옥답 OpenApi ( http://openapi.okdab.com/)  (1) 2010.08.19