Geting de données xml à l'aide de xml parser expat
J'ai réussi à analyser ok. Mais maintenant, je vais avoir de la difficulté à obtenir les valeurs
que j'ai besoin. Je peux obtenir de l'élément et les attributs. Mais ne peut pas obtenir les valeurs.
Je voudrais obtenir la valeur de l'image dans le document xml, il est de 20.
/* 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'
OriginalL'auteur ant2009 | 2009-03-04
Vous devez vous connecter pour publier un commentaire.
Il est assez difficile avec les expatriés. expat est mieux quand vous êtes uniquement intéressé par la structure, et non pas le contenu des éléments. Pourquoi ne pas utiliser libxml à la place? Quelles sont vos raisons pour l'utilisation d'un même analyseur comme expatrié, plutôt qu'un arbre?
De toute façon, la façon de le faire est de fixer un personnage de gestionnaire de données. Voici un exemple, en fonction de votre code:
handle_data
n'a pas besoin de concaténer du texte comme l'élément de données peut être divisée en plusieurs appels. Citant: [xml.com/pub/a/1999/09/expat/reference.html#chardatahandler] _A seul bloc contigu de texte libre de balisage peut tout de même entraîner dans une séquence d'appels de ce gestionnaire. En d'autres termes, si vous êtes à la recherche d'un motif dans le texte, il peut être fractionné entre les appels à ce gestionnaire. _ Aussi, vous n'avez pas besoin dedata = (void *) tmp;
parce que vous êtes en utilisant la variable globale pour transmettre des données.OriginalL'auteur bortzmeyer
De la "valeur" 20 est le personnage de données "20" sur l'élément dont le tag est "item" et dont le nom de l'attribut est "image".
Pour recevoir des données de caractère événements, inscrire un rappel avec la
XML_SetCharacterDataHandler
fonction.Ce rappel permettra de recevoir les données de caractère. L'analyseur peut diviser le personnage de données - généralement à la poignée d'atteindre la fin d'un tampon, ou pour les entités (donc pour
foo&bar
votre gestionnaire d'obtenir trois appels - "foo", "&" et "bar"), de sorte que vous avez à coller à la chaîne les pièces ensemble à nouveau si vous avez besoin de l'ensemble des données.Vous savez quand vous avez toutes les données de caractère à l'intérieur d'un nœud lorsque vous recevez l'élément suivant à démarrer ou à proximité de rappel.
Quand vous avez toutes les données de caractère, vous pouvez les traiter.
Un stand-alone exemple simplifié à partir de votre code:
OriginalL'auteur Pete Kirkham