그나저나 망할(?) &lt를 <로 바꿔버리는 바람에 귀찮아지네...

특수문자를 건드리지 않고 바이패스 하는법 없으려나?

 

#include <stdio.h>
#include <string.h>
#include <expat.h>

#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

#ifdef XML_UNICODE_WCHAR_T
# define XML_FMT_STR "ls"
#else
# define XML_FMT_STR "s"
#endif

#define BUFFSIZE        8192

char Buff[BUFFSIZE];
char Buff_con[BUFFSIZE];

int Depth;
XML_Parser p;

static void XMLCALL
start(void *data, const XML_Char *el, const XML_Char **attr)
{
  int i;
  (void)data;

  for (i = 0; i < Depth; i++)
    printf("\t");

  printf("<%" XML_FMT_STR, el);

  for (i = 0; attr[i]; i += 2) {
    printf(" %" XML_FMT_STR "=\"%" XML_FMT_STR "\"", attr[i], attr[i + 1]);
  }

  printf(">");
//  printf(">\n");
  Depth++;
}

static void XMLCALL
data(void *data, const XML_Char *s, int len)
{
        if(len > 0)
        {
        memcpy(Buff_con, s, len);
        Buff_con[len] = '\0';
        printf("%s", Buff_con);
        }
}

static void XMLCALL
end(void *data, const XML_Char *el)
{
  int i;
  (void)data;
  (void)el;

//  for (i = 0; i < Depth; i++)
//    printf("\t");

  printf("</%" XML_FMT_STR, el);
  printf(">");
//  printf(">\n");
  Depth--;
}

int
main(int argc, char *argv[])
{
//  XML_Parser p = XML_ParserCreate(NULL);
  p = XML_ParserCreate(NULL);
  (void)argc;
  (void)argv;

  if (! p) {
    fprintf(stderr, "Couldn't allocate memory for parser\n");
    exit(-1);
  }

  XML_SetElementHandler(p, start, end);
  XML_SetCharacterDataHandler(p, data);
  XML_SetParamEntityParsing(p, XML_PARAM_ENTITY_PARSING_NEVER);

  for (;;) {
    int done;
    int len;

    len = (int)fread(Buff, 1, BUFFSIZE, stdin);
    if (ferror(stdin)) {
      fprintf(stderr, "Read error\n");
      exit(-1);
    }
    done = feof(stdin);

    if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
      fprintf(stderr,
              "Parse error at line %" XML_FMT_INT_MOD "u:\n%" XML_FMT_STR "\n",
              XML_GetCurrentLineNumber(p),
              XML_ErrorString(XML_GetErrorCode(p)));
      exit(-1);
    }

    if (done)
      break;
  }
  XML_ParserFree(p);
  return 0;
}

 

start / end

[링크 : https://github.com/libexpat/libexpat/blob/master/expat/examples/elements.c]

 

data

[링크 : https://stackoverflow.com/questions/609376/geting-xml-data-using-xml-parser-expat]

 

 

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

expat 다시 사용..  (0) 2019.06.24
GPX TCX 포맷  (0) 2013.06.22
Javascript DOM API / XML  (2) 2010.07.13
[해결중] expat 버퍼 관련 문제  (0) 2010.05.25
expat으로 smi 자막파일 파싱은 불가?  (0) 2010.05.03
SAX (Simple API for XML)  (0) 2010.04.23
Posted by 구차니

댓글을 달아 주세요