서비스 프로그램을 작성하다보면, 날씨 정보를 이용하는 경우가 간혹 있을 수 있다. 

     

    아래의 프로그램은 libxml 샘플을 이용하여 기상청 날씨를 파싱할 수 있도록 구성 하였다.

     

    1. 준비사항

      기상청 홈페이지에서 제공되는 RSS 정보를 파일로 저장한다. 이때 파일명은 xml로 설정한다.

     

    2. 컴파일 방법

      컴파일은 libxml2에서 안내하는 방식을 그대로 이용한다. 

    gcc `xml2-config --cflags --libs` -o [생성할 바이너리 이름] [소스파일 이름].c

     

    3. 소스 입력

      일부는 수정했지만 libxml의 예제를 그대로 가져와서 필요한 부분만 수정하면 아래와 같다. 

    #include <stdio.h>
    #include <libxml/parser.h>
    #include <libxml/tree.h>
    #include <string.h>
    #include <stdio.h>
    #include <libxml/parser.h>
    #include <libxml/tree.h>


    #ifdef LIBXML_TREE_ENABLED


    int strprn=0;
    int start=0;


    /**
     * print_element_names:
     * @a_node: the initial xml node to consider.
     *
     * Prints the names of the all the xml elements
     * that are siblings or children of a given xml node.
     */
    static void print_element_names(xmlNode * a_node)
    {
        xmlNode *cur_node = NULL;


        for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
            //printf("Node type. type[%d]\n", cur_node->type);
            if (cur_node->type == XML_ELEMENT_NODE) {
    //          printf("node type: Element, name[%s], content[%s]\n", cur_node->name, cur_node->content);
                if(!strcmp(cur_node->name,"city"))
                {
                    start = 1;
                    strprn = 1;
                }
                else if(!strcmp(cur_node->name,"tmEf") && start!=0)
                    strprn = 1;
                else if(!strcmp(cur_node->name,"wf") && start!=0)
                    strprn = 1;
                else if(!strcmp(cur_node->name,"tmn") && start!=0)
                    strprn = 1;
                else if(!strcmp(cur_node->name,"tmx") && start!=0)
                    strprn = 1;
                else
                    strprn = 0;


            }
            else if(cur_node->type == XML_TEXT_NODE)
            {
                if(strprn == 1)
                    printf("text[%s]\n", cur_node->content);
                strprn = 0;
            }


            print_element_names(cur_node->children);
        //  printf("--(%d)---\n",strprn);
        }
    }


     /**
     * Simple example to parse a file called "file.xml",
     * walk down the DOM, and print the name of the
     * xml elements nodes.
     */
    int main(int argc, char **argv)
    {
        xmlDoc *doc = NULL;
        xmlNode *root_element = NULL;


        if (argc != 2)
            return(1);


        /*
         * this initialize the library and check potential ABI mismatches
         * between the version it was compiled for and the actual shared
         * library used.
         */
        LIBXML_TEST_VERSION


        /*parse the file and get the DOM */
        doc = xmlReadFile(argv[1], NULL, 0);


        if (doc == NULL) {
            printf("error: could not parse file %s\n", argv[1]);
        }


        /*Get the root element node */
        root_element = xmlDocGetRootElement(doc);


        print_element_names(root_element);


        /*free the document */
        xmlFreeDoc(doc);


        /*
         *Free the global variables that may
         *have been allocated by the parser.
         */
        xmlCleanupParser();


        return 0;
    }
    #else
    int main(void) {
        fprintf(stderr, "Tree support not compiled in\n");
        exit(1);
    }
    #endif

     

    실행하면, 지역과 온도가 터미널 화면에 표시되는 것을 확인할 수 있다.

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기