나는 구문 분석에 성공했습니다. 하지만 지금은 내가 필요로하는 값인 을 얻는 데 문제가 있습니다. 요소와 속성을 가져올 수 있습니다. 그러나 값을 얻을 수 없습니다. 나는이 XML로 프레임의 값을 좀하고 싶습니다 그것은 그것은 해외 거주자 꽤 어렵다 (20)xml 파서를 사용하여 xml 데이터 가져 오기 expat
/* track the current level in the xml tree */
static int depth = 0;
/* first when start element is encountered */
void start_element(void *data, const char *element, const char **attribute)
{
int i;
for(i = 0; i < depth; i++)
{
printf(" ");
}
printf("%s", element);
for(i = 0; attribute[i]; i += 2)
{
printf(" %s= '%s'", attribute[i], attribute[i + 1]);
}
printf("\n");
depth++;
}
/* decrement the current level of the tree */
void end_element(void *data, const char *el)
{
depth--;
}
int parse_xml(char *buff, size_t buff_size)
{
FILE *fp;
fp = fopen("start_indication.xml", "r");
if(fp == NULL)
{
printf("Failed to open file\n");
return 1;
}
XML_Parser parser = XML_ParserCreate(NULL);
int done;
XML_SetElementHandler(parser, start_element, end_element);
memset(buff, 0, buff_size);
printf("strlen(buff) before parsing: %d\n", strlen(buff));
size_t file_size = 0;
file_size = fread(buff, sizeof(char), buff_size, fp);
/* parse the xml */
if(XML_Parse(parser, buff, strlen(buff), XML_TRUE) == XML_STATUS_ERROR)
{
printf("Error: %s\n", XML_ErrorString(XML_GetErrorCode(parser)));
}
fclose(fp);
XML_ParserFree(parser);
return 0;
}
<data>
<header length="4">
<item name="time" type="time">16</item>
<item name="ref" type="string">3843747</item>
<item name="port" type="int16">0</item>
<item name="frame" type="int16">20</item>
</header>
</data>
Output from parsing
Element: data
Element: header length= '4'
Element: item name= 'time' type= 'time'
Element: item name= 'ref' type= 'string'
Element: item name= 'port' type= 'int16'
Element: item name= 'frame' type= 'int16'
는 malloc에 크기는 길이 + 1이어야한다. – Hyndrix
'handle_data'는 요소 데이터가 여러 호출로 분할 될 수 있으므로 텍스트를 연결해야합니다. 인용 : [http://www.xml.com/pub/a/1999/09/expat/reference.html#chardatahandler] _ 마크 업이없는 연속 된 텍스트의 단일 블록이 여전히 일련의 호출을 유발할 수 있습니다 매니저. 즉, 텍스트에서 패턴을 검색하는 경우이 핸들러에 대한 호출을 통해 분할 될 수 있습니다. _ 전역 변수를 사용하여 데이터를 전달하기 때문에'data = (void *) tmp;'는 필요 없습니다. – FractalSpace