본문 바로가기

ETC Programmings

XML을 처음으로 사용해보다.. XmlDocument, XmlReader 클래스

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

귀찮아 프로그램을 사용하다보니까 점점 욕심이 많이 생깁니다. 프로그램의 기능 자체를 사람의 개입 없이 자동으로 처리 해 주고 싶은 마음까지 생기니까요.. 뭐 물론 그렇게 하기 위해서는 자연어 처리라는 난제를 해쳐 나가야하는데.. 이건 순전히 욕심이고 -_-;; 어쨌거나.. 네이버를 검색하면 각종 광고에 플래시들이 난무하는데다가 특히 플래시같은 경우에는 굉장히 리소스를  많이 잡아먹어서 버벅댑니다. 그 때문에 메모리 최적화나 성능을 고려 안한 중구남방의 귀찮아 같은 경우는 -ㅅ-;;.. 좀 암울합니다.

그래서.. 네이버 OpenApi 를 통해서 검색 데이터를 XML 데이터로 받아오는 방법을 알게 되었습니다. 확실히 XML 데이터로 받아오는 건 알겟습니다만.. 이 XML 데이터를 다시 객체로 만들 방법을 전혀 몰랐던것입니다 ;ㅅ;

데이터의 원천이 DBMS 인 경우에는 Data Access Object 를 생성해서 만들... 었었지? 라는 생각을 하다보니까 마찬가지로 XML 데이터를 잘 파싱할 필요가 있다는걸 알게 됐고 MSDN 라이브러리를 막 뒤지던 도중에 알게 됐습니다. XmlReader 라는 클래스에서 Create(String uri) 이라는 전역 메소드를 이용해서 URL에서부터 XML 데이터를 뽑아 올 수 있다는 것을!! 움하하..

그래서 만들어 봤습니다. XmlDataParser 라는 클래스 인데요.. 뭐 별거 아닙니다 ㅡㅡ;;

namespace 귀찮아.WebApps
{
    public class XmlDataParser
    {
        private RequestParameterManager rpm;
        private List<Item> resultItems;
        private XmlDocument xmlDoc;

        public RequestParameterManager RequestParameterManager
        {
            get { return rpm; }
            set { rpm = value; }
        }

        public XmlDataParser(RequestParameterManager rpm)
        {
            this.rpm = rpm;
            resultItems = new List<Item>();
            xmlDoc = new XmlDocument();
        }
        public XmlDataParser(RequestParameterManager rpm, int size)
        {
            this.rpm = rpm;
            resultItems = new List<Item>(size);
            xmlDoc = new XmlDocument();
        }

        public XmlNodeList getNodeListByTag(string tag, int display)
        {
            xmlDoc.Load(XmlReader.Create(rpm.defaultQueryMaker(rpm.Target, display ,rpm.Query)));
            return xmlDoc.GetElementsByTagName(tag);
        }

        public void parseXmlData(int display)
        {
            if (rpm.Query == null)
                MessageBox.Show("검색어가 지정되지 않았습니다");
            else
            {
                Item item;
                XmlNodeList titleList = getNodeListByTag("title", display), linkList = getNodeListByTag("link", display), descList = getNodeListByTag("description", display);
                for (int i = 0; i < titleList.Count - 1; i++)
                {
                    item = new Item(titleList[i + 1].InnerText, linkList[i + 1].InnerText, descList[i + 1].InnerText);
                    resultItems.Add(item);
                }
            }
        }
        public void initList()
        {
            resultItems = new List<Item>();
        }
        public void simpleSearch(WebBrowser web, string query)
        {
            Test(query);
            string header = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html><head><title>검수페이지</title><style type='text/css'>.bodyStyle{font-family: '맑은 고딕', 돋움, 굴림;font-size : 11px;}a{text-decoration:none;font-weight:bold;color: Green;}.titleStyle{width: 380px;}.descStyle{width: 380px;margin-bottom: 10px;}</style></head><body class='bodyStyle'>";
            string body = Test("HElloWorld");
            string footer = "</body></html>";
            web.DocumentText = header + body + footer;
        }
        public string Test(string keyWord)
        {
            string body = "";
            rpm.Query = keyWord;
            rpm.Target = RequestParameterManager.CategoryTarget.kin;
            parseXmlData(5);
            body += getBody(rpm.Target);
            rpm.Target = RequestParameterManager.CategoryTarget.blog;
            parseXmlData(4);
            body += getBody(rpm.Target);
            rpm.Target = RequestParameterManager.CategoryTarget.book;
            parseXmlData(3);
            body += getBody(rpm.Target);
            rpm.Target = RequestParameterManager.CategoryTarget.cafe;
            parseXmlData(3);
            body += getBody(rpm.Target);
            rpm.Target = RequestParameterManager.CategoryTarget.doc;
            parseXmlData(5);
            body += getBody(rpm.Target);
            rpm.Target = RequestParameterManager.CategoryTarget.news;
            parseXmlData(5);
            body += getBody(rpm.Target);
            rpm.Target = RequestParameterManager.CategoryTarget.webkr;
            parseXmlData(3);
            body += getBody(rpm.Target);
            return body;
        }

        public string getBody(int start, int end, RequestParameterManager.CategoryTarget target)
        {
            string body = "";
            body += "<div style='font-size : 13px;'> ☞ " + rpm.getCategory() + "</div>";
            for (int i = start; i < end; i++)
            {
                string title = "<div id='title' class='titleStyle'><a id='link' href='" + resultItems[i].Link + "' target='_blank'>" + resultItems[i].Title + "</a></div>";
                string desc = "<div id='description' class ='descStyle'>"+ resultItems[i].Description +"</div>";
                body += title + desc;
            }
            initList();
            return body;
        }
        public string getBody(RequestParameterManager.CategoryTarget target)
        {
            return getBody(0, resultItems.Count, target);
        }

        private string getfooter()
        {
            return "</body></html>";
        }

        private string getHeader()
        {
            return "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html><head><title>검수페이지</title><style type='text/css'>.bodyStyle{font-family: '맑은 고딕', 돋움, 굴림;font-size : 11px;}a{text-decoration:none;font-weight:bold;color: Green;}.titleStyle{width: 380px;}.descStyle{width: 380px;margin-bottom: 20px;}b{color : Red;font-weight:bold;text-decoration:underline;}</style></head><body class='bodyStyle'>";
        }
    }
}


RequestParameterManager 라는 클래스는 OpenApi에서 제공하는 파라미터 변수를 구색에 맞게 설정해서 최종 URL를 리턴하도록 하는 클래스 입니다. 한마디로 검색하고자 하는 조건과 검색쿼리를 변경해주는것이죠..

아무튼 이놈을 이용해서 XML 데이터를 분석해내서 Item 이라고 정의해 놓은 DAO 클래스로 객체화 시켜서 최종적으로는 Html 페이지에 그려주는 것이죠.. Html 페이지에 그려주는 것은 그야말로 노가다에 가까운데.. 후에는 Javascript로 만들어주는게 좋을것 같습니다.

XmlDocument 클래스는 구조화된 XML 형태에 최적화 되어 있는 클래스입니다. Load라는 메소드를 사용해서 XmlReader클래스가 읽어들인 XML 데이터를 구조화 시킵니다. 최종적으로 XML 데이터를 가져오기 위한 클래스로는 딱 두개만 있으면 되는거였죠.. XmlDocument 클래스는 이전에 HtmlElement 클래스를 이용한것과 상당히 유사하기때문에 어려운 점이 없었습니다 ^^

그.. 런.. 데... 우째 얘가 더 느립니다 -_-;; 푸하하