J'ai réussi à analyser correctement. Mais maintenant j'ai du mal à obtenir les valeurs dont j'ai besoin. Je peux obtenir l'élément et les attributs. Mais ne peut pas obtenir les valeurs. Je voudrais obtenir la valeur du cadre dans ce xml il est 20.Obtenir des données xml à l'aide de l'analyseur 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'
Dans la méthode "handle_data" la taille de malloc doit être la longueur + 1. – Hyndrix
'handle_data' doit concaténer le texte car les données de l'élément peuvent être divisées en plusieurs appels. Citant: [http://www.xml.com/pub/a/1999/09/expat/reference.html#chardatahandler] _Un seul bloc de texte contigu sans balisage peut encore entraîner une séquence d'appels à cette gestionnaire. En d'autres termes, si vous recherchez un motif dans le texte, il peut être partagé entre les appels de ce gestionnaire. _ De même, vous n'avez pas besoin de 'data = (void *) tmp;' car vous utilisez une variable globale pour transmettre des données. – FractalSpace