레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시

2013년 4월 3일 수요일

[C#] xml 파징 예제


기상청에서 제공하는 날씨 api를 통해서

C# 에서 xml 문서를 파징하는 예제입니다.

단순하게 XmlDocument 객체를 생성하고, 로드할 xml 문서 주소를 넘겨주고

GetElementsByTagName 과 같은 함수를 이용해서 노드리스트를 얻으실 수 있습니다 :)

class Weather
{
    // http://www.kma.go.kr/wid/queryDFS.jsp?gridx=98&gridy=84  기상청 날씨 xml 이용
    public string weather = "";

    public Weather()
    {
        getWeather();
    }

    public void getWeather() {
        XmlDocument docX = new XmlDocument(); // XmlDocument 생성

        try
        {
            docX.Load("http://www.kma.go.kr/wid/queryDFS.jsp?gridx=98&gridy=84"); // url로 xml 파일 로드

        }
        catch
        {
            return;
        }

        XmlNodeList hourList = docX.GetElementsByTagName("hour"); // 태그 이름으로 노드 리스트 저장
        XmlNodeList tempList = docX.GetElementsByTagName("temp");
        XmlNodeList weatherList = docX.GetElementsByTagName("wfKor");

        // 활용 예제
        weather = "   = 울산 날씨 =\n";
        weather += hourList[0].InnerText + "시 : " + weatherList[0].InnerText + " (" + tempList[0].InnerText + "℃)\n";
        weather += hourList[1].InnerText + "시 : " + weatherList[1].InnerText + " (" + tempList[1].InnerText + "℃)\n";
        weather += hourList[2].InnerText + "시 : " + weatherList[2].InnerText + " (" + tempList[2].InnerText + "℃)\n";
        weather += hourList[3].InnerText + "시 : " + weatherList[3].InnerText + " (" + tempList[3].InnerText + "℃)\n";
        // weather += hourList[4].InnerText + "시 : " + weatherList[4].InnerText + "(" + tempList[4].InnerText + "℃)\n";
        // weather += hourList[5].InnerText + "시 : " + weatherList[5].InnerText + "(" + tempList[5].InnerText + "℃)\n";
    }
}

[C#] HttpWebRequest 로 http GET, POST 전송 및 처리


C# 에서 GET 혹은 POST 방식으로 http 리퀘스트를 보내는 예제입니다.

HttpWebRequest 인스턴스의 CookieContainer 를 이용하면 쿠키도 설정할 수 있습니다.

한글 값을 POST 방식으로 전송할 경우 UTF8 인코딩을 해서

바이트 데이터로 바꾼 후 HttpWebRequest 에 추가해 주시면 됩니다.

HttpWebRequest wReq;
HttpWebResponse wRes;

private bool getResponse(String url, string cookie, string data)
{
    string cookie;

    try
    {
        uri = new Uri(url); // string 을 Uri 로 형변환
        wReq = (HttpWebRequest)WebRequest.Create(uri); // WebRequest 객체 형성 및 HttpWebRequest 로 형변환
        wReq.Method = "GET"; // 전송 방법 "GET" or "POST"
        wReq.ServicePoint.Expect100Continue = false;
        wReq.CookieContainer = new CookieContainer(); 
        wReq.CookieContainer.SetCookies(uri, cookie); // 넘겨줄 쿠키가 있을때 CookiContainer 에 저장

        /* POST 전송일 경우
        byte[] byteArray = Encoding.UTF8.GetBytes(data);

        Stream dataStream = wReq.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
        */

        using (wRes = (HttpWebResponse)wReq.GetResponse())
        {
            Stream respPostStream = wRes.GetResponseStream();
            StreamReader readerPost = new StreamReader(respPostStream,  Encoding.GetEncoding("EUC-KR"), true);

            resResult = readerPost.ReadToEnd();
        }

        return true;
    }
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
        {
            var resp = (HttpWebResponse)ex.Response;
            if (resp.StatusCode == HttpStatusCode.NotFound)
            {
                // 예외 처리
            }
            else
            {
                // 예외 처리
            }
        }
        else
        {
            // 예외 처리
        }

        return false;
    }
}


// 활용 예제 
private void searchBoard(PortalBoard[] board, string boardId, int sPage, int ePage, string query)
{
    MainForm.gridView.Columns[4].HeaderText = "조회수";

    for (int i = 0; i < 10 * 10; i++)
    {
        board[i] = new PortalBoard();
    }

    for (int pageNum = sPage; pageNum <= ePage; pageNum++)
    {
        byte[] b = System.Text.Encoding.GetEncoding(51949).GetBytes(query);
        string result = "";

        foreach (byte ch in b)
        {
            result += ("%" + string.Format("{0:x2} ", ch)); // EUC-KR 인코딩
        }

        string url = "http://portal.unist.ac.kr/EP/web/collaboration/bbs/jsp/BB_BoardLst.jsp?boardid="
            + boardId + "&nfirst=" + pageNum 
            + "&searchcondition=BULLTITLE&searchname=" + result.Replace(" ","");

        if (!getResponse(url)) // HttpWebRequest 전송
            return;

        doc = (IHTMLDocument2)new HTMLDocument(); // 파징을 위해 IHTMLDocument2 객체 생성
        // IHTMLDocument1, IHTMLDocument2, IHTMLDocument3, IHTMLDocument4
        // 데이터형 마다 사용할 수 있는 함수 종류 다름. msdn 참고

        doc.clear();
        doc.write(resResult);
        doc.close();

        IEnumerable titles = ElementsByClass(doc, "ltb_left");    
        IEnumerable elements = ElementsByClass(doc, "ltb_center");

        // 파징 후 각자 활용
    }
}

[C#] WebBrowser 컨트롤 파징 예제


C# 에서 간단한 웹 브라우징 어플을 만들때 사용하는 WebBrowser 컨트롤 이용해서

소켓을 보내는 것 보다 간단한 파징을 하실 수 있습니다.

WebBrowserReadyState.Complete 를 이용해 브라우징이 완료되길 기다리고

웹브라우저 객체의 Document 속성을 HtmlDocument 로 형 변환하시면 됩니다.

public void getCourceMenu()
{
    HtmlDocument doc = null; // HtmlDocument 오브젝트

    for (int i = 0; i < board.Count(); i++)
    {
        string url = "http://bb.unist.ac.kr/webapps/blackboard/content/courseMenu.jsp?course_id=" + board[i].url;

        browser.Navigate(url); // 이동

        while (browser.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents(); // 웹페이지 로딩이 완료될 때 까지 대기
        }

        doc = browser.Document as HtmlDocument; 
        HtmlElementCollection options = doc.GetElementsByTagName("Option");

        HtmlElement elements = ElementsByClass(doc, "courseMenu").ElementAt(0); // 아래에 정의된 함수 이용
        HtmlElementCollection lists = elements.GetElementsByTagName("li"); // 태그 이름으로 파징
        HtmlElementCollection a = elements.GetElementsByTagName("a");

        // 파징한 데이터 활용 예
        board[i].menu = new List();
        board[i].menuUrl = new List();

        for (int j = 0; j < lists.Count; j++)
        {
            board[i].menu.Add(lists[j].InnerText);
            board[i].menuUrl.Add(a[j].GetAttribute("href"));
        }
    }

    addCourseMenu();
}

static IEnumerable ElementsByClass(HtmlDocument doc, string className)
{
    foreach (HtmlElement e in doc.All)
        // GetAttribute 함수를 통해 클래스 이름으로 IEnumerable 오브젝트를 얻음
        if (e.GetAttribute("className") == className) 
            yield return e; // 찾은 e 를 리턴할 IEnumerable 에 추가
}

[C#] 레지스트리 등록 예제 (자동 로그인)


C# 에서 윈도우 레지스트리를 추가하는 예제입니다.

보통 아이디와 비밀번호 입력할 때 자주 사용될 거 같은데,

클래스를 그대로 복사해서 사용하시면 될 거 같습니다.

RegistryKey 인스턴스를 만들고, CurrentUser\Software\ 경로에 키를 등록하면 됩니다.

using Microsoft.Win32;

class AutoLogin
{
    public AutoLogin()
    {

    }

    public bool ReadRegistry(ref string id, ref string pw)
    {
        RegistryKey reg = Registry.CurrentUser.CreateSubKey("SoftWare").CreateSubKey("robot_carpedm20");

        id = reg.GetValue("ID", "").ToString();
        pw = reg.GetValue("PW", "").ToString();

        if (id == "" || id == "" && pw == "")
            return false;
        else
            return true;
    }

    public void WriteRegistry(string id, string pw)
    {
        RegistryKey reg = Registry.CurrentUser.CreateSubKey("SoftWare").CreateSubKey("robot_carpedm20");
        // RegistryKey reg = Registry.LocalMachine.CreateSubKey("SoftWare").CreateSubKey("robot_carpedm20");
        // LocalMachine 에 등록할 경우 프로그램 실행 시 관리자 권한 필요

        reg.SetValue("ID", id);
        reg.SetValue("PW", pw);
    }
}

2013년 3월 17일 일요일

Robot



created by carpedm20
version 1.1.0

Download

수정중

- 주요 기능 -


- 포탈 그룹웨어 게시판 (학사공지, 전체공지, 대학원 공지, 최신 게시물) 모아보기

- 10분마다 포탈 공지 자동 업데이트 ('세션 리로드(새로 고침)' 버튼을 직접 클릭해서 수동 업데이트 가능)

- 블랙보드 수강중인 과목 메뉴 모아보기

- 학술정보관 도서자료 검색 (네이버 도서 평점 연동), 스터디룸 예약, 열람실 좌석 현황, 도서 대출, 예약, 신청 현황 보기

- 간단한 브라우저를 통해 포탈, 종합 정보, 블랙보드, 학술정보관, 기숙사, 전자 우편, 학사 일정, 야식 정보, 총재 클럽 바로가기

- 기상청 DB를 통해 간단한 울산 날씨(기온) 보기

- 개인 알림 기능 (시간을 정해서 알림을 설정해 두면 정해진 시간 이후 작업표시줄에서 알림이 뜨는 기능)

- 간단한 메일 보내기 기능 (UNIST 메일 계정 이용)

- 랜덤 명언 기능

- 기타 숨은 기능








프로그램을 이용하기 위해서는 .NET 프레임워크 3.5 이상의 버전과 익스플로러 9 이상의 버전이 필요합니다.

프로그램이 실행될 때 오류가 발생한다면 아래의 링크에서 .NET 프레임워크 3.5 SP1  을 받으시기 바랍니다.



아직 다양한 환경에서 테스트 해보지 못해 예상치못한 오류가 발생할 수 있습니다.

오류가 발생할 경우, 운영체제, 설치된 .NET 프레임워크 버전, 오류 발생 경로를

carpedm20@gmail.com 으로 보내주시면 최대한 빠르게 업데이트 할 수 있도록 노력하겠습니다.

이외에도 건의 사항 및 기타 의견은 언제든지 환영합니다.


마지막으로 프로그램은 C# 으로 만들었으며 소스코드는 http://github.com/carpedm20/robot 에 공개되어 있습니다.

오픈 소스이므로 필요하신분은 누구나 사용하셔도 무방합니다 :)


Robot 을 통해 불편했던 학교 웹사이트 이용에 조금이나마 도움이 되었으면 좋겠습니다.

감사합니다 :)