C에서 XML 파싱(libxml2 활용하기)

개발/프로그래밍2008.05.28 20:37


XMLSOFT 사이트
샘플코드 및 API가 잘 나와 있다.

다운받기

버전은 편한 대로 다운 받는다.


리눅스에서는 libxml2-2.6.32.tar.gz 이상없이 설치가 되고
현재 AIX 5.3에서 설치는 되었으나

실행시 라이브러리 참조를 못 하는 듯 하여 RPM를 다운 받아서 설치하였다.

AIX다운받기  설치하였음


./configure; make ; make install
로 쉽게 설치가 된다.

 

C 소스 작성과 동일하며 컴파일 시에 gcc -Wall -o bpng `xml2-config --cflags` bpng.c



# # CC = gcc DEBUGFLAG = -g BASEDIR = /home/openbase/wonhong/xml/TEST CFLAGS = `xml2-config --cflags` LIBS = `xml2-config --libs` SRCS = bpng.c BINS = bpng $(BINS): $(SRCS) echo "" make -f Makefile OBJS=$@.o EXE=$@ build build: $(OBJS) $(CC) $(CFLAGS) $(LIBS) -o $(EXE) $(OBJS)






/** bpng.c 메뉴얼에 있는 소스를 거의 그대로 사용 XML의 내용만 읽는 기능만 있음 Modified By 일퍼센트 */ #include #include #include #include #include #include void parseChannel (xmlDocPtr doc, xmlNodePtr cur) { xmlChar *key; cur = cur->xmlChildrenNode; while (cur != NULL) { if((!xmlStrcmp(cur->name, (const xmlChar *) "item"))) { parseItem(doc, cur); } else if((!xmlStrcmp(cur->name, (const xmlChar *) "title"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("BLOG NAME: %s\n", key); xmlFree(key); } else if((!xmlStrcmp(cur->name, (const xmlChar *) "link"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("MY BLOG LINK : %s\n", key); xmlFree(key); } cur = cur->next; } xmlFreeDoc(doc); return; } void parseItem(xmlDocPtr doc, xmlNodePtr cur){ xmlChar *key; cur = cur->xmlChildrenNode; while (cur != NULL) { if((!xmlStrcmp(cur->name, (const xmlChar *) "title"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("제목: %s\n", key); xmlFree(key); } else if((!xmlStrcmp(cur->name, (const xmlChar *) "description"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("내용: %s\n", key); xmlFree(key); } else if((!xmlStrcmp(cur->name, (const xmlChar *) "author"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("글쓴이: %s\n", key); xmlFree(key); } else if((!xmlStrcmp(cur->name, (const xmlChar *) "pubDate"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode,1); printf("등록일자: %s\n", key); } cur = cur->next; } return; } static void parseDoc(char *docname) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr,"empty document\n"); xmlFreeDoc(doc); return; } if (xmlStrcmp(cur->name, (const xmlChar *) "rss")) { fprintf(stderr,"document of the wrong type, root node != rss"); xmlFreeDoc(doc); return; } cur = cur->xmlChildrenNode; //channel while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *) "channel"))){ parseChannel (doc, cur); } cur = cur->next; } xmlFreeDoc(doc); return; } int main(int argc, char **argv) { char *docname; if (argc <= 1) { printf("Usage: %s docname\n", argv[0]); return(0); } docname = argv[1]; parseDoc (docname); return (1); }



 

Rss.xml 파일은

RSS XML 동일한 형태를 가지며 한글은 제외시켜서 테스트하였다.

Libxml2 자체에서 EUC_KR이 인식이 안 되는 듯 하여 iconv 라이브러리 사용해야 할 듯

이거 나중에 올려야겠다.


 

작성자

Posted by 일퍼센트

태그

관련 글

댓글 영역

  • 프로필 사진
    gcc입문
    2010.08.28 19:16 신고

    gcc -Wall -o bpng `xml2-config --cflags` bpng.c

    컴파일 명령에서 'xml2-config --clags' 가 의미하는 게 무엇인가요?

    제가 컴파일하면 libxml xmlmemory.h="" 이거와 libxml parser.h="" 이것을 찾을 수 없다고 나옴니다. 분명 libxml2 설치는 했거든요. 저도 라이브러리를 참조를 못하는 것 같은데 무슨 libxml2 라이브러리를 어느 폴더에 설치해야 하나요?

    무엇이 문제일까욤...

    • 프로필 사진
      2010.08.29 17:15 신고

      소스로 설치를 하였나요?

      ./configure --prefix=/usr
      usr 디렉토리 위치에 설치를 해 보세요.

      저 또한 2년전에 사용을 해봐서 도움이 안 되네요.

    • 프로필 사진
      2016.06.09 23:21 신고

      댓글을 늦게 봤네요. 질문하셔도 됩니다. 아는 범위까지 알려드릴께요~