expat-2.0.1 에 포함되어있는 예제파일인
elements.c를 약간 변형하여

XML tag로 출력되도록 약간 수정하였다.
컴파일에 필요한 libexpat.lib 파일과 expat.h 파일
그리고 테스트용 XML 파일(youtube page)가 포함되어있다.
(libexpat.lib는 내부적으로 libexpat.dll을 호출하는 것으로 보인다.)



/* This is simple demonstration of how to use expat. This program
reads an XML document from standard input and writes a line with
the name of each element to standard output indenting child
elements by one tab stop more than their parent element.
It must be used with Expat compiled for UTF-8 output.
*/

#include "stdio.h"
#include "expat.h"

#if defined(__amigaos__) && defined(__USE_INLINE__)
#include "proto/expat.h"
#endif

#ifdef XML_LARGE_SIZE
#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
#define XML_FMT_INT_MOD "I64"
#else
#define XML_FMT_INT_MOD "ll"
#endif
#else
#define XML_FMT_INT_MOD "l"
#endif

static void XMLCALL
startElement(void *userData, const char *name, const char **atts)
{
	int i;
	int *depthPtr = (int *)userData;
	for (i = 0; i < *depthPtr; i++)
		putchar('\t');
	printf("<%s>\n",name);
//	puts(name);
	*depthPtr += 1;
}

static void XMLCALL
endElement(void *userData, const char *name)
{
	int i;
	int *depthPtr = (int *)userData;
	*depthPtr -= 1;
	for (i = 0; i < *depthPtr; i++)
		putchar('\t');
	printf("</%s>\n",name);
	//	puts(name);
}

int
main(int argc, char *argv[])
{
	FILE *fp;
	char buf[BUFSIZ];
	XML_Parser parser = XML_ParserCreate(NULL);
	int done;
	int depth = 0;
	
	fp = fopen("GetRecentlyFeaturedVideoFeed.xml","r");
	
	XML_SetUserData(parser, &depth);
	XML_SetElementHandler(parser, startElement, endElement);
	do {
		int len = (int)fread(buf, 1, sizeof(buf), fp);
		done = len < sizeof(buf);
		if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
			fprintf(stderr,
				"%s at line %" XML_FMT_INT_MOD "u\n",
				XML_ErrorString(XML_GetErrorCode(parser)),
				XML_GetCurrentLineNumber(parser));
			return 1;
		}
	} while (!done);
	XML_ParserFree(parser);
	fclose(fp);
	return 0;
}

'프로그램 사용 > expat & XML' 카테고리의 다른 글

xml 트리 탐색 - XML tree navigation  (0) 2010.04.17
expat XML_SetCharacterDataHandler() function  (0) 2010.04.09
&amp; &lt; &gt; &quot; 는 머지?  (0) 2010.03.31
expat '간략한' 사용법  (0) 2010.03.28
expat-2.0.1 example  (11) 2010.03.23
expat  (4) 2010.03.21
Posted by 구차니
TAG

댓글을 달아 주세요

  1. 초보

    안녕하세요 expat를 사용하기 시작했는데
    지금 컴파일조차 못하고있습니다 ㅠㅠ
    ubuntu에서 여기서받은 파일을 컴파일하려면
    어떤 명령어를 써야하냐요?
    gcc -라든지

    아니면 Makefile작성 하신게있나요?ㅠㅠ

    2015.11.16 11:01 [ ADDR : EDIT/ DEL : REPLY ]
    • $ sudo apt-get install expat
      $ gcc -lexpat elements.c

      라즈베리 파이에서 해서 expat이 설치되어 있을 가능성도 있기에
      안될 경우 libexpat1-dev 패키지를 설치해보시기 바랍니다.

      2015.11.16 11:12 신고 [ ADDR : EDIT/ DEL ]
  2. jjj

    혹시 질문 가능한가요 ㅠㅠㅠ

    2016.05.25 18:22 [ ADDR : EDIT/ DEL : REPLY ]
    • 질문은 가능하나.. 답변이 가능할진 모르겠습니다 ㅠㅠ
      쓴지 오래된 녀석이고 조금만 건드려봐서요 ㅠㅠ

      2016.05.25 18:34 신고 [ ADDR : EDIT/ DEL ]
    • 비밀댓글입니다

      2016.05.26 10:36 [ ADDR : EDIT/ DEL ]
    • xml 파싱이 목적이신가요?
      xml 파싱을 통해 DOM tree 생성이나, 특정 값을 뺴내고 수정하는게 목적인가요?
      위의 내용에 따라 접근방법이나 사용할 라이브러리 등이 달라질수 있습니다.

      2016.05.26 10:53 신고 [ ADDR : EDIT/ DEL ]
    • jjj

      buffer에 xml형태의 문자를 받아서 이것을 .txt형태로 바꾼 다음에
      그 xml내용을 name:aaa value:21 이런식으로 파일을 읽어오고 싶습니다ㅜㅜ 수정이나 삭제의 목적은 없고 그냥 파싱을 하고싶습니다!ㅠㅠ

      2016.05.26 11:04 [ ADDR : EDIT/ DEL ]
    • 공부 목적으로 위의 라이브러리를 통해 직접 파싱할게 아니라면
      http://xmlstar.sourceforge.net/doc/xmlstarlet.txt 와 같은 유틸리티를 이용해서 저장된 xml중 원하는 값만 빼내는 옵션을 찾아 보시는게 간편하게 검증도 잘 될거라고 생각합니다.
      expat을 쓰면.. element / variable 별로 핸들러를 생성해서
      일일이 다 처리 해주어야 하기에
      dom tree 생성도 수작업으로 하고.. 어떤 조건(어떤 element 값에 어떤 value 라던가..)에 부합하는 값을 빼내려면 작업량이 상당히 많아 집니다.
      웹에서 하는 거라면 HTML DOM을 적용해 javascript로 편하게 처리하는 것도 방법입니다.

      2016.05.26 11:12 신고 [ ADDR : EDIT/ DEL ]
    • jjj

      아ㅜㅜ 감사합니다 지금 c랑 c++을 통해서 파싱하려고 하고있습니다ㅜㅜ

      2016.05.26 11:17 [ ADDR : EDIT/ DEL ]
    • expat 라이브러리 사용해서 해도 되는건가요?
      parsing 과제로 하는건가요? 후자라면.. automata 쪽에서
      state diagram 공부하셔서 직접 파싱 룰에 따라 파싱하셔야 합니다.
      xml은 그래도 문법이 엄격해서 파서를 짜기 쉽습니다.

      2016.05.26 11:19 신고 [ ADDR : EDIT/ DEL ]
    • jjj

      아 감사합니다!!!ㅜㅜ 라이브러리를 사용하든 직접 소스를 작성하든 parsing만 되면된다고하셨습니다ㅜㅜ네 parsing이 과제입니다
      한번 알아보겠습니다ㅠㅠㅠ

      2016.05.26 11:28 [ ADDR : EDIT/ DEL ]