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);
- }
- string.h>
Rss.xml 파일은
RSS XML 동일한 형태를 가지며 한글은 제외시켜서 테스트하였다.
Libxml2 자체에서 EUC_KR이 인식이 안 되는 듯 하여 iconv 라이브러리 사용해야 할 듯
이거 나중에 올려야겠다.