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

개발/프로그래밍2008. 5. 28. 20:37
728x90


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 라이브러리 사용해야 할 듯

이거 나중에 올려야겠다.


 

728x90

작성자

Posted by 일퍼센트

관련 글

댓글 영역